我只是想知道如何创建Mock对象来测试代码:
public class MyTest
{
private A a;
public MyTest()
{
a=new A(100,101);
}
}
由于
答案 0 :(得分:9)
使用new
实例化对象的代码会使测试变得困难。通过使用Factory pattern,您可以在要测试的代码之外移动对象的创建。这为您提供了一个注入模拟对象和/或模拟工厂的地方。
请注意,您选择
MyTest
作为要测试的类有点不幸,因为名称暗示它是测试本身。我会将其更改为MyClass
。此外,在构造函数中创建对象可以通过传入A
的实例轻松替换,因此我将创建移动到稍后将调用的方法。
public interface AFactory
{
public A create(int x, int y);
}
public class MyClass
{
private final AFactory aFactory;
public MyClass(AFactory aFactory) {
this.aFactory = aFactory;
}
public void doSomething() {
A a = aFactory.create(100, 101);
// do something with the A ...
}
}
现在,您可以在测试中传入模拟工厂,该工厂将创建您选择的模拟A
或A
。让我们用Mockito来创建模拟工厂。
public class MyClassTest
{
@Test
public void doSomething() {
A a = mock(A.class);
// set expectations for A ...
AFactory aFactory = mock(AFactory.class);
when(aFactory.create(100, 101)).thenReturn(a);
MyClass fixture = new MyClass(aFactory);
fixture.doSomething();
// make assertions ...
}
}
答案 1 :(得分:3)
使用mockito
mcking框架,尝试以下内容:
whenNew(MyTest.class)
.withArguments(Mockito.anyInt(), Mockito.anyInt())
.thenReturn(new MockedMyTest(param1, param2));
答案 2 :(得分:2)
使用界面Ia; 然后。
Class A implements Ia;
Class MockA implements Ia;
private Ia a;
然后
public MyMockTest {
a = new MockA(100, 100);
int result = a.doWork();
assertEquals(200, result);
// asuming doWork would add both constructor parameters
}