class A {
int a;
public int add() {
B b = new B();
a = b.calculate(4, 5);
return a;
}
}
class B {
public int calculate(int x, int y) {
return x * y;
}
}
我想测试A类,而又不想测试add()方法中的b.calculate()。 所以我需要模拟B类。
这是我的代码。
@Mock
B bclass;
A aclass;
@Before
public void setUp() {
bclass = new B();
aclass = new A();
}
@Test
public void testAClass() {
when(bclass.calculate(4, 5)).thenReturn(45);
assertEquals(45, aclass.add());
}
测试失败。怎么了?
答案 0 :(得分:1)
您似乎正在使用Mockit框架。 您可以尝试执行以下操作:
new MockUp<B>() {
@Mock
int calculate(int x, int y) // no access modifier required
{
return 45; // your value
}
};
答案 1 :(得分:1)
@Mock
注释已经生成了B的实例。我们在这里无需再次创建实例。另外,请确保使用“有效运行器”或“规则”进行注释。
@RunWith(MockitoJUnitRunner.class)
如果它不起作用,请告诉我们显示的错误。您也可以参考下面的链接,了解如何使用Mockito。
http://www.vogella.com/tutorials/Mockito/article.html#mockito_usage
答案 2 :(得分:1)
您的问题是类A
对类B
的隐藏依赖性。
@Jens的答案向您展示了如何使用 PowerMock 解决此问题,但我认为这是对您不良设计的屈服。
更好的方法是通过将类B
的实例注入到类A
的对象中(最好作为构造函数参数)来使此依赖 explicit 。
最好使用依赖注入框架,例如guice
或spring
。
您可以使用regulat Mockito构造。
class A {
int a;
private final B b;
public A(B b){
this.b=b;
}
public int add() {
a = b.calculate(4, 5);
return a;
}
}
@Mock
B bclass;
A aclass;
@Before
public void setUp() {
aclass = new A(bclass);
}
@Test
public void testAClass() {
when(bclass.calculate(4, 5)).thenReturn(45);
assertEquals(45, aclass.add());
}
答案 3 :(得分:0)
我不确定Mockito是否可行。使用PowerMockito可以工作:
@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
public class BTest {
A aclass;
B bMock;
@Before
public void setUp() throws Exception {
bMock = PowerMockito.mock(B.class);
PowerMockito.whenNew(B.class).withNoArguments().thenReturn(bMock);
aclass = new A();
}
@Test
public void testAClass() {
Mockito.when(bMock.calculate(4, 5)).thenReturn(45);
Assert.assertEquals(45, aclass.add());
}
}