我在使用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之间的区别...
答案 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).