Я новичок в Spring, и мне нужно написать тест для этого класса, если он вызывает методы:
class ClassOne {
@Autowired
AutowiredClass a1;
@Autowired
AutowiredClass a2;
void methodOne() {
a1.method1();
}
void methodTwo() {
a2.method2();
}
}
Пробовал написать тест, но не получилось, получил NPE:
class ClassOneTest {
@Autowired
ClassOneInterface c1i;
@Test
public void testMethod1() {
c1i.methodOne(); // <- NPE appears here..
Mockito.verify(ClassOne.class, Mockito.times(1));
}
}
Было бы здорово успешно протестировать методы пустоты.
Вы получаете NPE, потому что загруженный контекст в вашем тестовом примере не может найти упомянутый вами автоматический компонент. Вы должны аннотировать тестовый класс следующим образом:
@RunWith(SpringRunner.class)
@SpringBootTest
class ClassOneTest {
@Autowired
ClassOneInterface c1i;
@Test
public void testMethod1() {
c1i.methodOne(); // <- NPE appears here..
Mockito.verify(ClassOne.class, Mockito.times(1));
}
}
Попробуйте взглянуть на: Аналогичная ошибка теста NPE
ClassOne определяет Spring bean. Чтобы автоматически связать поля bean-компонента, вам нужен контекст Spring.
Если вы хотите протестировать ClassOne как SPRING BEAN, вам нужно использовать SpringTest.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({MyConfig.class}) // Spring context config class
class ClassOneTest {
@Autowired
ClassOneInterface c1i;
...
}
Bean-компонент ClassOne будет введен в поле набора тестов c1i.
Затем вы можете следить за полем, используя mockito:
ClassOne cSpy = spy(c1i);
Затем вы можете проверить вызовы метода:
verify(cSpy).someMethod(someParam);
Надеюсь это поможет
Вы можете убедиться в этом с помощью теста единица измерения:
@RunWith(MockitoJUnitRunner.class)
public class MyLauncherTest {
@InjectMocks
private ClassOne c1 = new ClassOne();
@Mock
private AutowiredClass a1;
@Mock
private AutowiredClass a2;
@Test
public void methodOne() {
c1.methodOne(); // call the not mocked method
Mockito.verify(a1).method1(); //verify if the a1.method() is called inside the methodOne
}
}