Wie kann ich verspotte alle Argumente zu einer privaten Methode mit PowerMockito?
Ich bin mit Mockito 1.9.5, PowerMock 1.5.1, JUnit 4.11 und Frühjahr 3.1.4.RELEASE. Ich bin versucht zu schreiben Sie einen JUnit-test in die ich will, zu verhöhnen, eine private Methode nichts zu tun. Die private Signatur der Methode ist
public class MyService
{
…
private void myMethod(byte[] data, UserFile userFile, User user)
{
Und in meinem JUnit-test habe ich
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
@PrepareForTest(MyServiceImpl.class)
public class MyServiceIT
{
@Rule
public PowerMockRule rule = new PowerMockRule();
@Autowired
private MyService m_mySvc;
private MyService m_mySvcSpy;
@Before
public final void setup() throws Exception
{
m_mySvcSpy = PowerMockito.spy(m_mySvc);
PowerMockito.doNothing().when(m_mySvcSpy, “myMethod”, Matchers.any(byte[].class), Matchers.any(UserFile.class), Matchers.any(User.class));
Leider die zweite Zeile stirbt mit der Ausnahme
testUploadFile(org.mainco.subco.user.service.MyServiceIT) Time elapsed: 12.693 sec <<< ERROR!
org.powermock.reflektieren.Ausnahmen.MethodNotFoundException: Keine Methode mit dem Namen 'myMethod' mit parameter-Typen: [ null, null, null ] in class org.mainco.subco.Benutzer.service.UserFileService$$EnhancerByMockitoWithCGLIB$$4e52bc77.
bei org.powermock.reflektieren.intern.WhiteboxImpl.throwExceptionIfMethodWasNotFound(WhiteboxImpl.java:1247)
bei org.powermock.reflektieren.intern.WhiteboxImpl.findMethodOrThrowException(WhiteboxImpl.java:985)
bei org.powermock.reflektieren.intern.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:882)
bei org.powermock.reflektieren.intern.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:713)
bei org.powermock.reflektieren.Whitebox.invokeMethod(Whitebox.java:401)
bei org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:93)
bei org.mainco.subco.Benutzer.service.MyServiceIT.setup(UserFileServiceIT.java:42)
Was ist die richtige Art und Weise zu verspotten Allgemeine Argumente für eine private Methode mit PowerMockito?
- Ich verstehe nicht, warum die PowerMockito.doNothing().wenn(m_mySvcSpy, "myMethod", null, null, null); Zeile befindet. Was ist es eigentlich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe es noch nicht getestet, aber ich glaube, der Grund, warum die private Methode nicht gefunden wird, ist, dass es nicht vorhanden in der Objekt-zur Verfügung gestellt von Frühjahr für die
MyService
- Schnittstelle. Dieses Objekt ist ein proxy , eine Instanz einer generierten Klasse, die nicht verlängernMyServiceImpl
; es ist also nichtprivate myMethod(...)
im es.Um das problem zu vermeiden, sollten Sie den test einfach nicht verwenden Frühling. Stattdessen instanziieren
MyServiceImpl
direkt in diesetup()
Methode. Wenn der test braucht andere Abhängigkeiten zu erhalten, injiziertm_mySvc
zu erzeugen, dann verspottet für diejenigen, und lassen Sie PowerMock injizieren Sie.In meinem Fall wollte ich die private Methode "Rückkehr" etwas, so das ist, was ich getan habe
wo meine private Methode ist ...
Die Prämisse für deine Frage scheint zu implizieren, dass Sie gegen die Single Responsibility Prinzip (SRP); wenn Sie brauchen, um zu testen, die private Methode, und zu tun, dass Sie brauchen, um zu injizieren Zeug in es, sollten Sie vielleicht in Erwägung ziehen es zu einem anderen Dienst.
Schlage ich vor, dass Sie Folgendes tun:
Mit dieser Trennung, können Sie injizieren etwas, das spottet das Verhalten des zuvor private Methode (nur Modell
IDependencyTwo
), wenn Sie die PrüfungMyService
, und ähnlich können Sie die verspotten, was Sie brauchen, um zu injizieren, in die zuvor private Methode von Spott und injizieren der Abhängigkeiten vonIDependencyTwo
.Ich denke, dass Ihr test ist versehen mit
SpringJUnit4ClassRunner
. In diesem Fall müssen Sie auf diePowerMockRule
:Außerdem sind Sie stubbing eine Methode
MyService
mit powermock. So müssen Sie kommentieren die test-Klasse mit@PrepareForTest
:Komplette code:
Konnte man sehen, ein vollständiges Beispiel für Spionage in der Dokumentation.
doNothing
, es war ein Fehler. Es ist wirklich wichtig zu wissen, dassMyService
ist eine Schnittstelle.@PrepareForTest(MyServiceImpl.class)
.Da Sie sehen, dieses Ausnahme:
org.powermock.reflect.exceptions.MethodNotFoundException: No method found with name ‘myMethod’ with parameter types: [ null, null, null ] in class
Können Sie versuchen, mit mockito ist isNull matcher (und wahrscheinlich auch mit einigen Typ-casting)?
In anderen Worten, verwenden Sie stattdessen
PowerMockito.doNothing().when(m_mySvcSpy, "myMethod", Matchers.isNull(byte[].class), Matchers.isNull(UserFile.class), Matchers.isNull(User.class));
Btw, man kann statische import
Matchers.isNull
so dass Sie können verwenden Sie einfachisNull
stattMatchers.isNull
byte[] data
param werden kann verspottet korrekt, was darauf hindeutet, dass die Ursache möglicherweise im Zusammenhang mit Ihrerorg.mainco.subco.user.service.UserFileService
. Können Sie erklären, wasUserFile
undUser
haben?Ich ging voran und verwendet "unterdrücken" ...