5

我只是想知道如何创建 Mock 对象来测试代码,例如:

public class MyTest
{
  private A a;
  public MyTest()
  {
     a=new A(100,101);
  }
}

?

谢谢

4

3 回答 3

10

直接使用实例化对象的代码new使测试变得困难。通过使用工厂模式,您可以将对象的创建移到要测试的代码之外。这为您提供了一个注入模拟对象和/或模拟工厂的地方。

请注意,您选择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 ...
    }
}

现在您可以在测试中传入一个模拟工厂,该工厂将创建一个模拟AA您选择的模拟工厂。让我们使用 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 ...
    }
}
于 2012-11-28T03:34:29.457 回答
3

使用mockitomcking 框架,尝试如下操作:

   whenNew(MyTest.class)
     .withArguments(Mockito.anyInt(), Mockito.anyInt())
     .thenReturn(new MockedMyTest(param1, param2));
于 2012-11-28T03:32:09.587 回答
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
}
于 2012-11-28T03:38:36.643 回答