Frühling + Mockito test Injektion
Meine Frage ist sehr ähnlich der Frage in Die Injektion Mockito mocks in eine Spring-bean. In der Tat, ich glaube, dass die akzeptierte Antwort, es könnte tatsächlich für mich arbeiten. Allerdings habe ich ein Problem mit der Antwort, und dann eine weitere Erklärung, falls die Antwort gibt es in der Tat nicht meine Antwort.
Also folgte ich dem link in der oben genannten post an die Springockito website. Ich veränderte meine test-config.xml
etwas ähnlich dem folgenden:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mockito="http://www.mockito.org/spring/mockito"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.mockito.org/spring/mockito http://www.mockito.org/spring/mockito.xsd">
...
<mockito:mock id="accountService" class="org.kubek2k.account.DefaultAccountService" />
...
</beans>
Scheint es etwas falsch mit der www.mockito.org
redirect derzeit, so fand ich die XSD-code https://bitbucket.org/kubek2k/springockito/raw/16143b32095b/src/main/resources/spring/mockito.xsd und verändert Sie den letzten Eintrag in der xsi:schemaLocation diese bitbucket link.
Läuft mvn test
dann erzeugt der folgende Fehler (Zeilenumbrüche Hinzugefügt, um die Lesbarkeit zu verbessern):
Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:
Line 43 in XML document from class path resource [spring/test-context.xml] is invalid;
nested exception is org.xml.sax.SAXParseException; lineNumber: 43; columnNumber: 91;
The prefix "mockito" for element "mockito:mock" is not bound.
Also die Frage, Springockito ist: Ist es überhaupt noch möglich, diese aufzunehmen? Was bin ich?
Nun, auf zur weiteren Erklärung...
Habe ich eine Schnittstelle, deren Implementierung, die ich bin versucht zu testen:
public interface MobileService {
public Login login(Login login);
public User getUser(String accessCode, Date birthDate);
}
Die Umsetzung enthält ein DAO-Spring @Autowire
s in mir:
@Service
public class MobileServiceImpl implements MobileService {
private MobileDao mobileDao;
@Autowired
public void setMobileDao(MobileDao mobileDao) {
this.mobileDao = mobileDao;
}
}
Möchte ich nicht ändern, meine Oberfläche um eine setMobileDao
Methode, denn das wäre das hinzufügen von code, um meine unit-Tests. Ich versuche zu verspotten, aus dem DAO, da das eigentliche SUT hier ist die ServiceImpl. Wie kann ich das erreichen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wollen Sie nicht testen Sie Ihre Schnittstelle: es enthält überhaupt keinen code. Sie wollen testen Sie Ihre Implementierung. Also der setter verfügbar ist. Ganz einfach:
Keine Notwendigkeit für einen spring-Kontext. Nur instantiieren Ihre POJO-service, injizieren mock Abhängigkeiten manuell und testen Sie die Methoden, die Sie testen möchten.
@Mock
und@InjectMocks
Anmerkungen. Sie sollten finden Sie in den jeweiligen javadoc.Nach dem Kampf mit der Springockito XSD Problem, für eine Weile fand ich eine viel einfachere Lösung. Lassen Sie den Frühling Spritzen die Modelle für die Sie über eine factory-Methode, d.h. in applicationContext.xml setzen:
wo die AccountsDAO bean injiziert BankingService Klasse. Die entsprechenden JUnit-Testfall ist:
Persönlich finde ich das sehr elegant und einfach zu verstehen. Für mehr details, siehe die original blog post.
Haben Sie drei Möglichkeiten, um Ihre mock-dao:
Wenn Sie wollte, zu tun, #3, müssen Sie einen Konstruktor der MobileService akzeptiert MobileDao.
Dann ist dein test wird so Aussehen:
Bitte beachten Sie, dass Sie nicht zur Verfügung gestellt haben, uns mit den details der MobileDao so habe ich eine getUser-Methode akzeptiert eine Zeichenfolge.
Machen Sie den test pass, Ihre MobileServiceImpl würde, muss nur dieses:
setMobileDao
zu der Schnittstelle, hinzufügen von einem anderen ctor zu übergeben, in der DAO-Objekt, das verändern von code zur Unterstützung von unit-tests. Als pro @jb-nizet 's Antwort, wenn ich das alter meiner test-nicht verwenden, um nicht die Schnittstelle sondern die Umsetzung, dann habe ich schon Zugriff auf diesetMobileDao
Methode.Das problem sieht wie der classpath enthält nicht die tatsächlichen springockito Glas - Sie müssen nicht zum ändern der URL ' s - diese sind nur die tokens, die verwendet werden, intern im Frühjahr - Sie sind nicht gelöst - alles, was Sie brauchen, ist eine neue, genug, der Frühling Verteilung und springockito auf classpath.
Kuba (Schöpfer der oben genannten lib 🙂 )
Ich hatte das gleiche problem, ich wollte verwenden springockito, indem nach deren wiki aber Validierungen xml-Fehler auslösen. Also, wenn ich versuchte, gehen an Orte, wo xsd sein soll, das hat sich nicht. So ich Lesen Sie diese und lernen Sie die Arbeit mit diesem:
Aber wenn ich suchen auf diesem link, hatte ein schlechtes Gefühl. Es scheint mir, dass nicht dauerhafte stabile Verbindung (Sie müssen überprüfen, wenn ich falsch Liege)