【问题标题】:Mockito - Spring unit testsMockito - 春季单元测试
【发布时间】:2017-05-24 18:40:10
【问题描述】:

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

}

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

【问题讨论】:

  • dzone.com/articles/use-mockito-mock-autowired 据此,您可能需要在FooImpl 实例上使用@InjectMocks 以允许Mockito 自动创建它(并为您注入依赖项)而不是手动创建。你试过了吗?
  • 我现在试试这个,但我使用的是 Mockito Cookbook(Marcin Grejszczak 撰写),书中提到您可以使用 setUp 方法或 InjectMocks 进行初始化 - 所以我认为它们会是一样的。

标签: spring mockito


【解决方案1】:

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

}

或者在被测对象内手动设置mock对象。

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

【讨论】:

    【解决方案2】:
    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
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 2012-10-19
      • 1970-01-01
      • 2017-12-13
      相关资源
      最近更新 更多