模拟方法永远不会被调用

时间:2015-01-01 12:39:13

标签: java unit-testing junit mockito

我正在尝试为java类编写测试用例。我已经使用Mockito模拟了一种方法,但模拟从未被使用过。为什么呢?

以下是我的java类的结构:

class A {

 @Autowired
 private ClassB classB;

 publiv void methodOne() {
  methodTwo();
 }

 private void methodTwo() {
  ...
  int returnedValue = classB.someMethod();
  ...
 }
}

测试课程如下:

class ATest {

 @Mock
 private ClassB classB;

 @InjectMocks
 @Autowired
 ClassA classA;

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

 @Test(expected = SomeException.class)
 public void testMethodOne() {
  when(classB.someMethod()).thenReturn(29);
  classA.methodOne();
 }
}

测试类从具有@RunWith(SpringJUnit4ClassRunner.class)注释的另一个扩展。

我已经完成了现有的问题,但一直无法找到答案。如果有任何可能对我有帮助的问题/答案,请指出我的相同内容。

提前致谢!

3 个答案:

答案 0 :(得分:0)

您可以尝试删除测试类@Autowired中的ATest

@InjectMocks应该足够了,因为它会创建您的测试对象并注入您的模拟。

根据您的JUnit跑步者@Autowired可能会在@InjectMocks之后执行第二次注入,这会覆盖您的模拟方法设置。

答案 1 :(得分:0)

首先,关于测试的一些注意事项: - 测试应该是公开的 - A级应该是公开的 - 测试中不需要@Autowire - 无需致电initMocks

然后,您的测试实际上并未测试是否正在使用模拟。让我们更改这些方法,以便它们现在返回值,以便我们可以测试它们是否有效:

public class ClassA {

    @Autowired
    private ClassB classB;

    public int methodOne() {
        return methodTwo();
    }

    private int methodTwo() {
        return classB.someMethod();
    }
}
public class ClassB {

    public int someMethod() {
        return 0;
    }

}

我们现在可以测试:

@RunWith(MockitoJUnitRunner.class)
public class ATest {

    @Mock
    private ClassB classB;

    @InjectMocks
    ClassA classA;

    @Test
    public void testMethodOne() {
        when(classB.someMethod()).thenReturn(29);
        final int result = classA.methodOne();
        assertEquals(29, result);
    }
}

测试通过 - 意味着模拟正确使用。

希望有所帮助。

答案 2 :(得分:0)

您缺少的是注释只是声明。 @Mock和@InjectMocks注释不执行任何操作。它们只是测试运行者可以看到的标记,用于执行特定的特定于跑步者的行为。您需要@RunWith注释来指定测试运行器,但是您需要针对特定​​行为的特定测试运行器。如果您正在使用SpringJUnit4ClassRunner,则不会使用任何Mockito注释。在任何情况下,我都不想使用SpringJUnit4ClassRunner进行单元测试,因为您应该只是验证业务逻辑,而不是布线。

将测试类更改为使用@RunWith(MockitoJUnitRunner.class)并删除基类引用。