使用Autowired类测试void方法

时间:2019-06-24 12:15:04

标签: java spring testing

我是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方法非常有用。

3 个答案:

答案 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));
    }
}

考虑一下:Similar NPE test error