我是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));
}
}
对于成功测试void方法非常有用。
答案 0 :(得分:3)
您可以使用单元测试来验证:
@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
}
}
答案 1 :(得分:2)
ClassOne定义了一个Spring bean。为了自动装配bean的字段,您需要一个Spring Context。
如果要将ClassOne作为SPEAN BEAN进行测试,则需要使用SpringTest。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({MyConfig.class}) // Spring context config class
class ClassOneTest {
@Autowired
ClassOneInterface c1i;
...
}
ClassOne bean将被注入到测试套件c1i字段中。
然后,您可以使用Mockito监视现场
ClassOne cSpy = spy(c1i);
然后您可以验证对其的方法调用:
verify(cSpy).someMethod(someParam);
希望这会有所帮助
答案 2 :(得分:1)
您正在获得NPE,因为在测试用例上加载的上下文找不到您提到的自动装配的bean。您应该这样注释测试类:
@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));
}
}