@InjectMocks后为空

时间:2014-11-21 15:49:00

标签: null mocking mockito inject

我在使用JUnit进行单元测试时遇到了一些依赖性问题。

考虑以下代码:

这是我要测试的类中的dependacy注入,我们称之为Controller。

@Inject private FastPowering fastPowering;  

这是单元测试:

@RunWith(MockitoJUnitRunner.class)
public class ControllerTest {

@Mock
FastPowering fastPower;

@InjectMocks
Controller controller;

@Test
public void test() {
    assertEquals(
            (controller.computeAnswer(new BigDecimal(2), 2)).longValue(),
            (long) Math.pow(2, 2));
    }
}

似乎fastPower为null,请解释如何解决这个问题。 空指针异常,因为在.computeAnswer方法中调用@injected字段(fastPower))

编辑:

解决了我应该读过@Mock和@Spy之间的区别...

5 个答案:

答案 0 :(得分:9)

使用MockitoAnnotations.initMocks发起@Mock@InjectMocks个对象。您的测试看起来像:

@Mock
FastPowering fastPower;

@InjectMocks
Controller controller;

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

@Test
public void test() {
    ....
}

答案 1 :(得分:2)

调试后,我找到了原因。这是因为集合org.powermock.core.MockRepository#instanceMocks不包含带有@InjectMocks批注(在您的情况下为“ Controller controller”)的字段的模拟。 为了解决这个问题,请尝试在字段声明中使用@Spy批注进行初始化,并在类声明上方使用@PrepareForTest:

@RunWith(MockitoJUnitRunner.class)
@PrepareForTest(Controller.class)
public class ControllerTest {

@Mock
FastPowering fastPower;

@InjectMocks
@Spy
Controller controller = new Controller();

@Test
public void test() {
    assertEquals(
            (controller.computeAnswer(new BigDecimal(2), 2)).longValue(),
            (long) Math.pow(2, 2));
    }
}

对我而言,它有所帮助。不需要使用Mockitoannotations.initMocks(this)方法,它不会影响结果。

答案 2 :(得分:1)

请注意,'MockitoAnnotations.initMocks(this);'的使用必须位于@ Before / setUp方法的 end 处。

如果它在您的设置的顶部,则可能会导致其他模拟类未初始化。 我刚才遇到了这个错误,并在我的@Before末尾放置了 .initMocks

答案 3 :(得分:0)

我通过删除在@Before方法中创建的无关的新实例来解决此问题(请参见下面的示例)。还可以通过在初始化MockitoAnnotations.initMocks(this)之后移动myClass来解决此问题,但是由于Mockito仍然创建了myClass,因此该解决方案效果不佳。

// Note - you may need @mock(name="foo") to help mockito differentiate props
//        if they have the same type
@mock
private Thing something;

@InjectMocks
private MyClass myClass;

@Before
 public void setUp() {
    MockitoAnnotations.initMocks(this); // Moving this below the next line fixed it...
    myClass = new MyClass() // But just remove this line and let Mockito do the work
}

答案 4 :(得分:-2)

还有2件事要检查:

1. Mocking the behaviours of fastPower. What should this mocked object return, when it methods are called? i.e. when(fastPower.doSomething()).thenReturn(some_kind_of_object);
2. Check if the controller.computeAnswer() does not return NULL for the input of new BigDecimal(2), 2)).longValue(), (long) Math.pow(2, 2).