Mockito - 弹簧单元测试



我一直在学习更多关于Java中的Mockito框架的知识,我不知道该怎么做才能完成这个单元测试。

基本上,来自控制台的错误表明,当Bar.sayHi((方法尝试从Foo测试运行时,存在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
    }
}

相关内容

  • 没有找到相关文章

最新更新