Ich habe kürzlich gelernt, PowerMock zu verwenden, um Komponententests für eine Klasse namens Module
zu schreiben, die die Klasse Base
erweitert. Sie sehen so aus.Mit PowerMock zum Schreiben von Komponententests kann die Mock-Methode nicht aufgerufen werden
public class Base {
protected final static ServiceA serviceA;
protected final static ServiceB serviceB;
static {
serviceA = ServiceA.getInstance();
serviceB = ServiceB.getInstance();
}
}
public class Module extends Base {
public DataA methodA() {
return serviceA.getDataA();
}
public DataB methodB() {
return serviceB.getDataB();
}
}
My Unit-Tests wie folgt aussehen:
@PowerMockIgnore("javax.management.*")
@RunWith(PowerMockRunner.class)
@PrepareForTest({Module.class, ServiceA.class, ServiceB.class})
public class ModuleTest {
private Module module;
@Mock
private ServiceA serviceA;
@Mock
private ServiceB serviceB;
@Before
public void setup() throws Exception {
MockitoAnnotations.initMocks(this);
PowerMockito.mockStatic(ServiceA.class);
PowerMockito.when(ServiceA.getInstance).thenReturn(serviceA);
PowerMockito.mockStatic(ServiceB.class);
PowerMockito.when(ServiceB.getInstance).thenReturn(serviceB);
module = new Module();
// I spy it because it has other methods I need to mock
module = PowerMockito.spy(module);
}
@Test
public void methodATest() {
DataA dataA = new DataA();
PowerMockito.when(serviceA.getDataA()).thenReturn(dataA);
DataA data = module.methodA();
assertEquals(dataA, data);
}
@Test
public void methodBTest() {
DataB dataB = new DataB();
PowerMockito.when(serviceB.getDataB()).thenReturn(dataB);
DataB data = module.methodB();
assertEquals(dataB, data);
}
}
Alles sieht einfach, aber wenn ich ModuleTest
ausführen, wird das methodBTest()
nicht passieren. Es scheint, dass PowerMockito.when(serviceB.getDataB()).thenReturn(dataB)
nicht funktioniert und die echte serviceB.getDataB()
Methode aufgerufen wird. Also assertEquals(dataB, data)
wirft org.junit.ComparisonFailure
.
Wenn ich die methodBTest()
vor methodATest()
setzen, wird die methodATest()
nicht bestanden. Gleicher Grund. Wenn ich PowerMockito.when(serviceA.getDataA()).thenReturn(dataA)
und PowerMockito.when(serviceB.getDataB()).thenReturn(dataB)
in das Setup() setze, funktioniert alles perfekt.
Das grenzt mich den ganzen Tag. Weiß jemand, warum dies geschieht und wie man es löst? Ich brauche die spöttische Aussage in den jeweiligen Testmethoden geschrieben, weil ich die zurückgegebenen Werte ändern kann.
Ich würde Ihnen vorschlagen PowerMock zu entfernen und wie etwas zu verwenden: 'public DataA methodA() { return methodA (ServiceA.getInstance()); }/* zu Testzwecken */protected DataA methodA (DienstA serviceA) { return serviceA.getDataA(); } –
@RC. Vielen Dank. Das könnte eine Lösung sein, aber eigentlich wurde ich gebeten, zu versuchen, die ursprüngliche Klasse nicht zu ändern. – IntoCode