복붙노트

[SPRING] JMockit을 사용하여 자동 인터페이스 구현 구현하기

SPRING

JMockit을 사용하여 자동 인터페이스 구현 구현하기

Spring autowiring을 사용하여 인터페이스의 인스턴스 인 종속성을 주입하는 클래스에 대해 JUnit 테스트를 작성하고 있습니다. 테스트 대상 클래스가 명시 적으로 종속성을 인스턴스화하거나 생성자에서 전달 된 적이 없기 때문에 JMockit은 인스턴스화해야한다고 느끼지 않습니다.

지금까지 우리는 SpringRunner를 사용하여 스프링로드 모의 의존성을 우리에게 가졌습니다. 우리가 싫어할 수있는 두 가지 사항은 1) 정확하게 실행되지 않는 테스트를 실행할 때마다 Spring 프레임 워크를로드하고 초기화해야하며 2) 모든 모의 종속성을 실제 클래스로 명시 적으로 작성해야합니다. JMockit은 도움을줍니다.

다음은 테스트 대상에 대한 간단한 예입니다.

public class UnitUnderTest {

   @Autowired
   ISomeInterface someInterface;

   public void callInterfaceMethod() {

      System.out.println( "UnitUnderTest.callInterfaceMethod calling someInterface.doSomething");
      someInterface.doSomething();
   }

}

그래서, 문제는, JMockit이 가짜 someInterface를 생성하게하는 방법이 있습니까?

해결법

  1. ==============================

    1.JMockit은 조롱 된 인터페이스를 항상 인스턴스화하지만 (최종 모의 필드의 경우 제외) 테스트 코드에서만 발생합니다. 테스트중인 코드에 인스턴스를 자동으로 주입하지 않습니다.

    JMockit은 조롱 된 인터페이스를 항상 인스턴스화하지만 (최종 모의 필드의 경우 제외) 테스트 코드에서만 발생합니다. 테스트중인 코드에 인스턴스를 자동으로 주입하지 않습니다.

    mock 인스턴스를 수동으로 주입해야합니다. 예 :

    public class SomeTest
    {
       @Autowired UnitUnderTest unitUnderTest;
       @Mocked ISomeInterface theMock; // created and assigned automatically
    
       @Test
       public void testSomeMethod()
       {
          Deencapsulation.setField(unitUnderTest, theMock);
          //proceed with unit test here
       }
    }
    

    mockit.Deencapsulation은 비공개 메소드를 호출하고 필드를 가져 오거나 설정할 수있는 Reflection 기반 유틸리티 클래스입니다.

  2. ==============================

    2.org.springframework.test.util.ReflectionTestUtils를 사용하여 조롱 된 ISomeInterface를 테스트 케이스에 명시 적으로 주입 할 수있다.

    org.springframework.test.util.ReflectionTestUtils를 사용하여 조롱 된 ISomeInterface를 테스트 케이스에 명시 적으로 주입 할 수있다.

    문서보기

  3. ==============================

    3.위에 제공된 힌트를 통해 JMockit을 처음 접했던 사람들에게 가장 유용한 것으로 나타났습니다. JMockit은 Deencapsulation 클래스를 제공하여 private 종속 필드 (Spring 라이브러리를 드래그 할 필요가 없음) 및 MockUp 클래스를 사용하면 명시 적으로 인터페이스의 구현을 만들고 인터페이스의 하나 이상의 메소드를 조롱 할 수 있습니다. 다음은이 특정 사례를 해결하는 방법입니다.

    위에 제공된 힌트를 통해 JMockit을 처음 접했던 사람들에게 가장 유용한 것으로 나타났습니다. JMockit은 Deencapsulation 클래스를 제공하여 private 종속 필드 (Spring 라이브러리를 드래그 할 필요가 없음) 및 MockUp 클래스를 사용하면 명시 적으로 인터페이스의 구현을 만들고 인터페이스의 하나 이상의 메소드를 조롱 할 수 있습니다. 다음은이 특정 사례를 해결하는 방법입니다.

    @Before
    public void setUp() {
    
       IMarketMakerDal theMock = new MockUp <IMarketMakerDal>() {
    
          @Mock
          MarketMakerDcl findByMarketMakerGuid( String marketMakerGuid ) {
    
             MarketMakerDcl marketMakerDcl = new MarketMakerDcl();
             marketMakerDcl.setBaseCurrencyCode( CURRENCY_CODE_US_DOLLAR );
             return marketMakerDcl;
          }
       }.getMockInstance();
    
       setField( unitUnderTest, theMock );
    }
    

    도와 주신 모든 분들께 감사드립니다.

  4. ==============================

    4.만난 사람들을 위해

    만난 사람들을 위해

    java.lang.IllegalStateException: Missing @Injectable for field *** 
    

    또는

    java.lang.IllegalStateException: Missing @Tested class for field ***
    

    스프링 (또는 스프링 부트) 프레임 워크에서 @autowired 필드를 조롱하기 위해 jmockit을 사용할 때의 오류.

  5. ==============================

    5.인터페이스에 대한 @Qualifier 주석이있는 경우 @Injectable 필드의 이름을 한정자의 이름과 동일하게 지정해야합니다.

    인터페이스에 대한 @Qualifier 주석이있는 경우 @Injectable 필드의 이름을 한정자의 이름과 동일하게 지정해야합니다.

    다음은 JMockit doc의 인용문입니다.

    예 :

    @Component
    public class AClass {
    
       @Autowired
       private Bean1 bean1;
    
       @Autowired
       @Qualifier("my-dashed-name")
       private AmqpTemplate rpcTemplate;
    }
    

    단위 테스트 클래스 :

    public class AClassTest {
    
       @Injectable
       private Bean1 bean1;
    
       @Injectable
       private AmqpTemplate myDashedName;
    
       @Tested
       private AClass aClass = new AClass();
    }
    

    또한 각 @Autowired 빈에 대해 setFiled를 사용할 필요가 없으며 @Tested 클래스가 인스턴스화 될 때 모든 필드가 자동으로 주입됩니다. JMockit ver에서 테스트되었습니다. 1.30

  6. from https://stackoverflow.com/questions/1980596/using-jmockit-to-mock-autowired-interface-implementations by cc-by-sa and MIT license