Это общий вопрос о том, как выполнить модульное тестирование Java-класса с использованием фиктивных объектов.
Я могу суммировать мою проблему с этим примером.
Допустим, у меня есть интерфейс с именем MyInterface.java и объект "TwoString", который не переопределяет equals ()
"TwoString.java"
private String string1;
private String string2;
public TwoString(String string1, String string2) {
this.string1 = string1;
this.string2 = string2;
}
...getters..setters..
"MyInterface.java"
void callMe(TwoString twoString);
Тогда у меня есть "MyClass.java" Объект. Его конструктор принимает конкретную реализацию MyInterface.
Метод MyClassToTest () содержит логику для создания объекта TwoString каким-либо образом. Допустим, он будет создан как
new TwoString("a","b")
Таким образом, когда вызывается метод ToTest (), он создает этот объект 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" в качестве строки1 и "b" в качестве строки2.
В этом случае объект 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 с правильным экземпляром