복붙노트

[SPRING] 봄 3 autowiring 및 junit 테스트

SPRING

봄 3 autowiring 및 junit 테스트

내 코드 :

@Component
public class A {
    @Autowired
    private B b;

    public void method() {}
}

public interface X {...}

@Component
public class B implements X {
    ...
}

격리 클래스 A에서 테스트하고 싶습니다. 클래스 B를 모의해야합니까? 그렇다면 어떻게? 그것은 autowired이고 조롱받은 객체를 보낼 수있는 설정자가 없기 때문입니다.

해결법

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

    1.B를 인스턴스화하고 인스턴스를 주입하는 대신 B를 모방해야합니다. A는 B가 작동하는지 여부를 테스트하는 것이므로 잠재적으로 손상된 B가 A의 테스트를 방해하지 않도록해야합니다.

    B를 인스턴스화하고 인스턴스를 주입하는 대신 B를 모방해야합니다. A는 B가 작동하는지 여부를 테스트하는 것이므로 잠재적으로 손상된 B가 A의 테스트를 방해하지 않도록해야합니다.

    즉, 나는 모 킷토를 강력 추천합니다. 조롱 프레임 워크가 사용됨에 따라 사용하기가 매우 쉽습니다. 다음과 같이 작성할 수 있습니다.

    @Test
    public void testA() {
        A a = new A();
        B b = Mockito.mock(B.class); // create a mock of B
        Mockito.when(b.getMeaningOfLife()).thenReturn(42); // define mocked behavior of b
        ReflectionTestUtils.setField(a, "b", b); // inject b into the B attribute of A
    
        a.method();
    
        // call whatever asserts you need here
    }
    
  2. ==============================

    2.다음은 Spring 3.1, JUnit 4.7 및 Mockito 1.9에서 작동하는 테스트의 예제입니다.

    다음은 Spring 3.1, JUnit 4.7 및 Mockito 1.9에서 작동하는 테스트의 예제입니다.

    FooService.java

    public class FooService {
        @Autowired private FooDAO fooDAO;
        public Foo find(Long id) {
            return fooDAO.findById(id);
        }
    }
    

    FooDAO.java

    public class FooDAO {
        public Foo findById(Long id) {
            /* implementation */
        }
    }
    

    FooServiceTest.java

    @RunWith(MockitoJUnitRunner.class)
    public class FooServiceTest {
        @Mock private FooDAO mockFooDAO;
        @InjectMocks private FooService fooService = new FooService();
    
        @Test public final void findAll() {
            Foo foo = new Foo(1L);
            when(mockFooDAO.findById(foo.getId()).thenReturn(foo);
    
            Foo found = fooService.findById(foo.getId());
            assertEquals(foo, found);
        }
    }
    
  3. ==============================

    3.Spring의 ReflectionTestUtils.setField (또는 junit 확장 PrivateAccessor)를 사용하여 리플렉션을 통해 필드를 삽입하거나 모의 애플리케이션 컨텍스트를 생성하고로드 할 수 있습니다. 간단한 단위 (비 통합) 테스트의 경우 간단 함을 위해 리플렉션을 사용하는 것이 좋습니다.

    Spring의 ReflectionTestUtils.setField (또는 junit 확장 PrivateAccessor)를 사용하여 리플렉션을 통해 필드를 삽입하거나 모의 애플리케이션 컨텍스트를 생성하고로드 할 수 있습니다. 간단한 단위 (비 통합) 테스트의 경우 간단 함을 위해 리플렉션을 사용하는 것이 좋습니다.

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

    4.이 포럼 토론은 나에게 의미가 있습니다. private 멤버 b를 클래스 B로 구현 된 InterfaceB 유형 (즉, 서비스 지향)으로 선언 한 다음 MockB 클래스가 동일한 인터페이스를 구현한다고 선언 할 수 있습니다. 테스트 환경의 응용 프로그램 컨텍스트에서 일반 B 클래스를 선언 한 MockB 클래스와 프로덕션 응용 프로그램 컨텍스트를 선언하고 두 경우 모두 A 클래스의 코드는 자동 배선되므로 변경하지 않아도됩니다.

    이 포럼 토론은 나에게 의미가 있습니다. private 멤버 b를 클래스 B로 구현 된 InterfaceB 유형 (즉, 서비스 지향)으로 선언 한 다음 MockB 클래스가 동일한 인터페이스를 구현한다고 선언 할 수 있습니다. 테스트 환경의 응용 프로그램 컨텍스트에서 일반 B 클래스를 선언 한 MockB 클래스와 프로덕션 응용 프로그램 컨텍스트를 선언하고 두 경우 모두 A 클래스의 코드는 자동 배선되므로 변경하지 않아도됩니다.

  5. from https://stackoverflow.com/questions/3660933/spring-3-autowiring-and-junit-testing by cc-by-sa and MIT license