模拟方法永远不会被调用



我正在尝试为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)注释的类扩展而来的。

我已经浏览了现有的问题,但无法找到答案。如果有任何可能对我有帮助的问题/答案,请指出我。

提前感谢!

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

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

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

首先,关于测试的一些注意事项:- 测试应该是公开的- 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);
    }
}

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

希望有帮助。

你缺少的是注释只是声明。 @Mock和@InjectMocks批注不执行任何操作。 它们只是测试运行程序可以看到的标记,用于执行特定于运行程序的特定行为。 您需要一个@RunWith批注来指定测试运行程序,但您需要一个特定的测试运行程序来指定特定行为。 如果您使用的是 SpringJUnit4ClassRunner,则不会使用任何 Mockito 注释。 无论如何,我不想将SpringJUnit4ClassRunner用于单元测试,因为您应该只验证业务逻辑,而不是布线。

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

相关内容

  • 没有找到相关文章

最新更新