Sie haben 3 Möglichkeiten, diese zu lösen:
Abstrakte Fabrik: Anstelle einer statischen Methode der Verwendung einer Betonfabrik-Klasse verwenden:
public abstract class AppleFactory {
public Apple createInstance(final String str);
}
public class AppleFactoryImpl implements AppleFactory {
public Apple createInstance(final String str) { // Implementation }
}
In Ihrer Testklasse, verspotten die Fabrik:
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
@Mock
private AppleFactory appleFactoryMock;
@Mock
private Apple appleMock;
@InjectMocks
MyClass myClass;
@Before
public void setup() {
when(appleFactoryMock.createInstance(Matchers.anyString()).thenReturn(appleMock);
}
@Test
public void myMethod(){
...
...
...
}
}
PowerMock: Verwenden Sie PowerMock ein Modell eines sta erstellen tic-Methode. Schauen Sie sich my answer to a relevant question an, um zu sehen, wie es gemacht wird.
Prüfbar Klasse: Machen Sie die Apple
in einem protected
Verfahren gewickelte Erstellung und eine Testklasse erstellen, die es außer Kraft setzt:
public class MyClass {
private Apple apple;
public void myMethod() {
apple = createApple();
....
....
....
}
protected Apple createApple() {
return AppleFactory.createInstance(someStringVariable);
}
}
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
@Mock
private Apple appleMock;
@InjectMocks
MyClass myClass;
@Test
public void myMethod(){
...
...
...
}
private class TestableMyClass extends MyClass {
@Override
public void createApple() {
return appleMock;
}
}
}
Natürlich in Ihrer Testklasse Sie TestableMyClass
und nicht MyClass
testen.
Ich werde Ihnen meine Meinung sagen, auf jedem der Methoden:
Die abstrakte Factory-Methode ist die beste - Dies ist ein klares Design, das die Details der Implementierung versteckt
Die testbare Klasse - Ist die zweite Option, die minimale Änderungen erfordert
- Die
PowerMock
Option ist meine am wenigsten - Statt für ein besseres Design zu gehen, ignorieren Sie und verstecken Ihr Problem. Aber das ist immer noch eine gültige Option.
Ehrfürchtig, danke. Ich muss Mockito in meiner Situation verwenden, also werde ich mit den Optionen von Abstract Factory oder TestableClass gehen. –
@saravana_pc - Ich habe mein Ranking zu den Problemen hinzugefügt. Trotzdem können Sie 'Mockito' mit Power Mock verwenden. Anstatt "@ Mock" und "@ InjectMock" zu verwenden, können Sie ihre äquivalenten Methoden verwenden (und damit können Sie die @RunWith (MockitoJUnitRunner.class) -Deklaration loswerden) – Avi
wenn Sie das abstrakte Fabrikmuster implementieren, wird keine Schnittstelle verwendet passender sein? –