In unserem Projekt habe ich Module Scout.client, Scout.Server, Scout.Shared und Backend.Eclipse Scout Neon Mock Backend Service
Backend hat keine Abhängigkeiten scout.server und scout.shared, aber scout.server hat Abhängigkeiten Backend.
Innen Backend-Projekt habe ich alle Business-Logik und ruft alle externen Dienstleistungen.
Mein Problem ist, wenn ich Scout Dienste zu testen versuchen, die einen Dienst von Backend verwenden.
Da Scout etwas großartiges Werkzeug für spöttische Bohnen bieten wir als Bohnen unseren Service innerhalb Backend definiert als:
BEANS.getBeanManager().registerClass(CarService.class);
BEANS.getBeanManager().registerClass(PartnerService.class);
Both, CarService.class und PartnerService.class sind in Backend.
Wenn ich versuche, ein paar Tests zu schreiben, und ich füge hinzu @BeanMock in Test Service
@BeanMock
private IPartnerService partnerService;
ich Mock, aber dann wieder jede jede Funktion null ist, auch wenn ich
doReturn(PartnerBuilder.standardPartnerListWithOneElement()).when(this.partnerService)
.getPartners(any(Set.class));
schreiben
Wenn ich in meinem Test debuggen, bevor dieser Test mit Debugger aufgerufen wird, kann ich:
partnerService.getPartners(...) -> return a list of person
was richtig ist, Wenn eine getestete Klasse diesen Dienst aufruft, gibt sie null aus.
Ich verstehe, dass diese Anmerkung @ApplicationScoped
auf der Schnittstelle zu fehlen zurückzuführen sein könnte. Ohne dies gibt es keine Garantie, dass nur eine bean
erstellt wird, und when
Anweisung reagieren auf eine andere Kopie dieser Bean ...?
Ich konnte nicht Anmerkung auf Schnittstelle hinzufügen, da Backend keine Abhängigkeiten hat Module auszukundschaften.
Wie könnte ich mit dieser Art von Fällen umgehen?
Getestet Klasse:
public class UtilityPartner {
/**
* Method return service bean for getting partners by ids.
*
* @return
*/
private static IPartnerService getPartnerService() {
return BEANS.get(IPartnerService.class);
}
public static String getPartnerName(final Long partnerId) {
if (partnerId == null) {
return "";
}
final List<Partner> partners =
(List<Partner>) getPartnerService().getPartners(Sets.newHashSet(partnerId));
if (partners == null || partners.isEmpty()) {
return "";
}
final Partner partner = partners.get(0);
return LookupUtil.createLookupDescription(partner.getId(), partner.getName());
}
}
Testklasse ist:
@RunWith(ServerTestRunner.class)
@RunWithSubject("anonymous")
@RunWithServerSession(ServerSession.class)
public class TestUtilityPartner {
@BeanMock
private IPartnerService partnerService;
@Before
public void init() {
doReturn(PartnerBuilder.standardPartnerListWithOneElement()).when(this.partnerService).getPartners(any(Set.class));
}
@Test
public void getPartnerName() {
final String name = UtilityPartner.getPartnerName(10L);
Assert.assertEquals("My name", name); // NAME IS ""
}
}
Wow diese Arbeit! Ich habe zusätzliche Frage: wäre es besser, dass ich BEAN wie Sie hier gepostet registrieren, wenn ich meine Bean registriere (nicht im Test, sondern im PlatformListener)? –
Ich kann das nicht im Kommentar beantworten. Verschieben Sie Ihre zweite Frage in einen anderen Thread: http://stackoverflow.com/questions/36164077/scout-bean-manager-registerclass-or-registerbean – Jmini
Ich habe das Beispiel aktualisiert, um 'TestingUtility' zu verwenden. Sie sollten Ihren Code aktualisieren. – Jmini