Wyobraźmy sobie, mam następujące klasy:Co to jest analogon Mockito.spy/doReturn w EasyMock?
public class TestClass {
public class Index<X> {
}
public class IndexData {
private final Index<?> index;
private final ReentrantReadWriteLock lock =
new ReentrantReadWriteLock();
public IndexData(final Index<?> index) {
super();
this.index = index;
}
public Index<?> getIndex() {
return index;
}
public Lock getReadLock() {
return lock.readLock();
}
public Lock getWriteLock() {
return lock.writeLock();
}
}
public void add(final InputClass input)
{
final IndexData index = getIndex(input);
final Lock lock = index.getWriteLock();
lock.lock();
try {
// Do something here, which requires synchronization
} finally {
lock.unlock();
}
}
protected IndexData getIndex(final InputClass input) {
// Some logic of getting the index for input
return null;
}
}
Chcę napisać badanej jednostki, która sprawdza,
- w metodzie
add
,index.getWriteLock()
jest używany (nieindex.getReadLock()
) - z blokada została zwolniona i zwolniono
- .
Korzystanie Mockito mogę napisać test takiego:
@Test
public void testAddUsesWriteLock() {
// Prepare
final TestClass objectUnderTest = Mockito.spy(new TestClass());
final InputClass input = Mockito.mock(InputClass.class);
final IndexData indexData = Mockito.mock(IndexData.class);
Mockito.doReturn(indexData).when(objectUnderTest).getIndex(input);
final Lock lock = Mockito.mock(Lock.class);
Mockito.doReturn(lock).when(indexData).getWriteLock();
// Invoke method under test
objectUnderTest.add(input);
// Verify
Mockito.verify(indexData).getWriteLock();
Mockito.verify(indexData, Mockito.never()).getReadLock();
Mockito.verify(lock).lock();
Mockito.verify(lock).unlock();
}
Jak mogę zrobić to samo z EasyMock?
Beton: Jak mogę zwrócić metodę w EasyMock (linia Mockito.doReturn(indexData).when(objectUnderTest).getIndex(input)
) w trybie getIndex
?
Uwaga: Kod ten można znaleźć pod następującym numerem: here.
Przepraszam, jeśli tylko Dokładna odpowiedź dotycząca Easymocka, ale myślę, że musisz zrobić krok wstecz i zadać sobie pytanie, dlaczego musisz "szpiegować" ("spy()" klasę, którą próbujesz przetestować. Jest to ogólnie [uznawane za zapach kodu] (http: //programmers.stackexchange.com/questions/212493/is-spying-on-test-class-bad-practice). Pomyślałem, że warto o tym wspomnieć na wypadek, gdybyście byli nowi w pisaniu testów tego rodzaju i mieli możliwość refaktoryzacji kodu. – Brad
@Brad Wiem, że tę praktykę można uznać za zły projekt. Jednak dla mnie ważniejsze jest przetestowanie wszystkiego, co chcę, niż eleganckiego projektu. Zasadniczo chcę mieć możliwość napisania automatycznego testu dla większości błędów wykrywanych ręcznie. W mojej szczególnej sytuacji jest to po prostu ważniejsze niż przyjemny projekt. Kod nie może być refaktoryzowany. –