繁体   English   中英

Mockito-弹簧单元测试

[英]Mockito - Spring unit tests

我一直在学习有关Java中Mockito框架的更多信息,而我不知道如何完成此单元测试。

基本上,来自控制台的错误指出,当尝试从Foo测试运行Bar.sayHi()方法时,会出现NullPointerException。 我怀疑这与自动接线字段有关(但我可能错了)?

以下是我遇到的问题的一个简单示例:

@RunWith(MockitoJUnitRunner.class)
public class FooTest {

    @Mock
    //@Spy // Cannot spy on an interface
    IBar bar;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test() {

        // Given 
        FooImpl foo = new FooImpl();
        foo.saySaySay();

        // When

        // Then

    }

}

这是正在测试的FooImpl类(Foo有一个接口):

public class FooImpl implements IFoo {

    @Autowired
    private IBar bar;

    public void saySaySay() {
        bar.sayHi();
    }

}

还有Bar类(还有Bar的接口):

public class BarImpl implements IBar {

    @Override
    public void sayHi() {
        System.out.println("hello");
    }

}

有人对此有建议吗? 谢谢。

仅创建Ibar的模拟项不会将该模拟项注入@Autowired字段。 自动装配是Spring的工作,而不是Mockito。 您需要显式告诉mockito使用@InjectMock将其注入测试对象

@RunWith(MockitoJUnitRunner.class)
public class FooTest {
    @InjectMocks
    FooImpl foo;

    @Mock
    IBar bar;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
    @Test
    public void test() {
        foo.saySaySay();
    }

}

或手动将模拟对象设置在测试对象中。

@Test
public void test() {
    FooImpl foo = new FooImpl();
    ReflectionTestUtils.setField(foo, "bar", bar);
    foo.saySaySay();    
}
RunWith(MockitoJUnitRunner.class)
public class FooTest {

    @Mock
    //@Spy // Cannot spy on an interface
    IBar bar;


    @InjectMocks
    private FooImpl foo;
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test() {

        // Given 
        foo.saySaySay();
        verify(bar).sayHi();
        // When

        // Then

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM