这是关于如何使用模拟对象对 Java 类进行单元测试的一般问题。
我可以用这个例子来总结我的问题。
假设我有一个名为 MyInterface.java 的接口和一个不覆盖 equals() 的“TwoString”对象
“双字符串.java”
private String string1;
private String string2;
public TwoString(String string1, String string2) {
this.string1 = string1;
this.string2 = string2;
}
...getters..setters..
“我的接口.java”
void callMe(TwoString twoString);
然后我有“MyClass.java”对象。它的构造函数接受 MyInterface 的具体实现。
MyClass methodToTest() 包含以某种方式创建 TwoString 对象的逻辑。假设它将被创建为
new TwoString("a","b")
因此,当调用 methodToTest() 时,它会创建这个 TwoString 对象,该对象将传递给接口方法callMe(TwoString twoString)。
我基本上想模拟界面。用这个模拟创建一个 MyClass 对象。然后验证是否使用 TwoString 的特定实例调用了模拟方法。
我正在使用 EasyMock,这是一些 java 代码
“MyClassTest.java”
public void test() throws Exception {
MyInterface myInterfaceMock = createMock(MyInterface.class);
MyClass myClass = new MyClass(myInterfaceMock);
myInterfaceMock.callMe(new TwoString("a","b")); <--- fails here
expectLastCall();
replay(myInterfaceMock);
myClass.methodToTest();
verify(myInterfaceMock);
问题来了。我在通话中期待的 TwoString 对象
myInterfaceMock.callMe(new TwoString("a","b"));
与 MyClass.methodToTest() 中生成的不同,因为 TwoString.java 不会覆盖等于。
我可以使用 TwoString 实例跳过问题
myInterfaceMock.callMe((TwoString)anyObject());
但我想确保使用 TwoString 的特定实例调用接口方法,该实例包含“a”作为 string1,“b”作为 string2。
在这种情况下,TwoString 对象非常简单,并且很容易覆盖 equals 方法 - 但是如果我需要检查更复杂的对象怎么办。
谢谢
编辑:
我将尝试通过此示例使其更具可读性
public class MyClassTest {
private MyClass myClass;
private TaskExecutor taskExecutorMock;
@Before
public void setUp() throws Exception {
taskExecutorMock = createMock(TaskExecutor.class);
myClass = new MyClass(taskExecutorMock);
}
@Test
public void testRun() throws Exception {
List<MyObj> myObjList = new ArrayList<MyObj>();
myObjList.add(new MyObj("abc", referenceToSomethingElse));
taskExecutorMock.execute(new SomeTask(referenceToSomethingElse, ???new SomeObj("abc", referenceToSomethingElse, "whatever"))); <--- ??? = object created using data in myObjList
expectLastCall();
replay(taskExecutorMock);
myClass.run(myObjList);
verify(taskExecutorMock);
}
}
???SomeObj = myClass.run() 使用 myObjList 中包含的数据创建的对象。
假设 SomeObj 来自第三方库,它不会覆盖 equals。
我想确定 taskExecutorMock.execute() 方法是使用该 SomeObj 的特定实例调用的
我如何测试 myClass.run() 实际上是用正确的实例调用 taskExecutorMock 方法