我正在尝试为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) 并删除基类引用。