Mockito - 弹簧单元测试

时间:2017-05-24 18:40:10

标签: spring mockito

我一直在学习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");
    }

}

有没有人对此提出建议?谢谢。

2 个答案:

答案 0 :(得分:3)

只是创建一个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();    
}

答案 1 :(得分:0)

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

    }

}