können Sie die wichtigsten IoC-Container verwenden und nur explizit die Testklasse injizieren. Jersey verwendet HK2 als sein DI-Framework, und sein IoC-Container ist das ServiceLocator
, das über eine Methode inject(anyObject)
verfügt, die beliebige Objekte mit Abhängigkeiten injizieren kann, die sich in seiner Registrierung befinden.
Zum Beispiel könnten Sie so etwas wie
public class InjectionTest {
@Inject
private TestController controller;
@Before
public void setUp() {
final Binder b = new AbstractBinder() {
@Override
public void configure() {
bindAsContract(TestController.class);
}
};
final ServiceLocator locator = ServiceLocatorUtilities.bind(new TestBinder(), b);
locator.inject(this);
}
@Test
public void doTest() {
assertNotNull(controller);
String response = controller.get();
assertEquals("Hello Tests", response);
}
}
tun Die ServiceLocatorUtilities
Klasse ist eine Hilfsklasse, die uns die ServiceLocator
leicht erstellen können, und dann inject(this)
nennen wir nur die InjectionTest
zu injizieren.
Wenn es scheint, dies für alle Controller-Tests zu wiederholen, können Sie eine abstrakte Basistestklasse erstellen. Vielleicht so etwas wie
public abstract class AbstractControllerTest {
protected ServiceLocator locator;
private final Class<?> controllerClass;
protected AbstractControllerTest(Class<?> controllerClass) {
this.controllerClass = controllerClass;
}
@Before
public void setUp() {
final AbstractBinder binder = new AbstractBinder() {
@Override
public void configure() {
bindAsContract(controllerClass);
}
};
locator = ServiceLocatorUtilities.bind(new TestBinder(), binder);
locator.inject(this);
}
@After
public void tearDown() {
if (locator != null) {
locator.shutdown();
}
}
}
Dann in Ihrer konkreten Klasse
public class TestControllerTest extends AbstractControllerTest {
public TestControllerTest() {
super(TestController.class);
}
@Inject
private TestController controller;
@Test
public void doTest() {
assertNotNull(controller);
assertEquals("Hello Tests", controller.get());
}
}
Wenn Sie etwas mehr Zeit damit verbracht, ich bin sicher, dass Sie mit einem besseren abstrakten Testklasse-Design kommen können. Es war das erste, was mir in den Sinn kam.
Hinweis: Für alles, was für eine Anfrage gilt, müssen Sie sich vielleicht nur darüber lustig machen. Beim Ausführen der Einheit Tests gibt es keinen Anfragekontext, so dass der Test fehlschlägt. Auch
Siehe:
Vielen Dank für die Antwort! Was ist ein TestBinder? – andreybavt
Es ist ein Ordner, den ich benutzt habe, um mein Beispiel zu testen. Es enthielt nur eine einfache Service-Bindung. Für Sie wäre es MyDIBinding –
@peeskillet Bitte füllen Sie diese Antwort mit einem TestBinder-Beispiel aus. – 4F2E4A2E