Mock eine Autowired ExecutorService
Abstract:
Habe ich eine Feder @Component
verwendet autowired ExecutorService als Arbeit-pool. Ich bin mit JUnit und Mockito zum testen der Funktionalität der Komponente und ich müssen zu verspotten, die Executor Service. Dies wurde trivial für andere autowired Mitglieder - ein allgemeiner Helfer, und einer DAO-Schicht zum Beispiel sind leicht zu spotten, aber ich brauche eine real Executor Service.
Code:
@RunWith(MockitoJUnitRunner.class)
public class MadeUpClassNameTest{
@Mock
private ExecutorService executor;
@Before
public void initExecutor() throws Exception{
executor = Executors.newFixedThreadPool(2);
}
@InjectMocks
private ASDF componentBeingAutowired;
...
Dies allein nicht funktioniert, die Ergebnisse invokeAll()
wird immer nur eine leere Liste.
Versuch mehr explizit mock-executor-Methode auch nicht funktioniert...
@Test
public void myTestMethod(){
when(executor.invokeAll(anyCollection()))
.thenCallRealMethod();
...
}
Bekomme ich die kryptisch formulierten Ausnahme:
Können Sie nicht verwenden, argument-Matcher außerhalb der Verifizierung oder Lunte.
(Ich dachte, das war eine Lunte ?)
Ich könnte bieten eine thenReturn(Answer<>)
Methode, aber ich möchte sicherstellen, dass der code tatsächlich funktioniert, mit ein Testamentsvollstrecker, ein gutes Stück des Kodex widmet sich der Zuordnung der Ergebnisse von Futures.
Problem
Wie erstelle ich ein real (oder funktional nutzbare mock) Executor-Service ? Alternativ ist meine Schwierigkeit bei der Prüfung dieser Komponente ist ein Zeichen, dass dies ein schlechtes design in der Notwendigkeit von refactoring, oder möglicherweise einen schlechten test-Szenario ?
Hinweise
Ich möchte betonen, dass mein problem NICHT immer oder Junit Mockito eingerichtet. Andere verhöhnt und tests ordnungsgemäß funktionieren. Mein problem ist spezifisch nur auf den jeweiligen mock oben.
Mit: Junit 4.12, Mockito 1.10.19, Hamcrest 1.3
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, der folgende code läuft nach dem Mock injiziert wird.
Dies bewirkt, dass Ihre lokale Kopie der
executor
gesetzt werden, aber nicht die eine, die eingespritzt wird.Ich würde empfehlen, mit constructor injection auf Ihre
componentBeingAutowired
und erstellen Sie eine neue, in Ihrem unit-test-und exclude Spring dependencies. Ihre test könnte dann Aussehen wie etwas weiter unten:Können Sie das @ - Spion-annotation.
org.mockito.exceptions.base.MockitoException: Unable to initialize @Spy annotated field 'someField'. Mockito cannot mock this class: class java.util.concurrent.Executors$FinalizableDelegatedExecutorService. Mockito can only mock non-private & non-final classes. If you're not sure why you're getting this error, please report to the mailing list. Underlying exception : java.lang.IllegalStateException: Error invoking java.lang.ClassLoader#findClass