Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试-如何创建模拟对象_Java_Unit Testing_Mocking - Fatal编程技术网

Java 测试-如何创建模拟对象

Java 测试-如何创建模拟对象,java,unit-testing,mocking,Java,Unit Testing,Mocking,我只是想知道如何创建模拟对象来测试以下代码: public class MyTest { private A a; public MyTest() { a=new A(100,101); } } ? 感谢使用mockitomcking框架,尝试以下方法: whenNew(MyTest.class) .withArguments(Mockito.anyInt(), Mockito.anyInt()) .thenReturn(new Mocked

我只是想知道如何创建模拟对象来测试以下代码:

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


感谢使用
mockito
mcking框架,尝试以下方法:

   whenNew(MyTest.class)
     .withArguments(Mockito.anyInt(), Mockito.anyInt())
     .thenReturn(new MockedMyTest(param1, param2));

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

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 ...
    }
}
请注意,选择
MyTest
作为要测试的类有点不幸,因为名称暗示它就是测试本身。我将把它改为
MyClass
。另外,在构造函数中创建对象可以通过传入
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 ...
    }
}
使用接口Ia; 那么

然后


那么,您想模拟
A
是一个
做一些复杂或不可重复的事情,需要模仿吗?是的,没有什么可以模仿的。您只是在构造函数中进行对象初始化…我认为他不应该将构造函数参数传递给MyClass.class.Emm。。。在“工厂”模式的情况下,我应该执行构造函数私有吗?@user592704-否,因为实例化
A
的工厂必须能够访问构造函数。
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
}