Verspottung eines statischen Feldes, das eine Klasse mit Mockito istJava

Java-Forum
Guest
 Verspottung eines statischen Feldes, das eine Klasse mit Mockito ist

Post by Guest »

Meine Utils-Klasse verfügt über eine Init-Methode, die von externen Ressourcen (z. B. einer Datenbankverbindung) abhängig ist und die ich mit Mockito erfolglos verspotte. Utils scheint von allen Instanzen meiner Anwendung gemeinsam genutzt werden zu können und wird daher in
als statisch (d. h. als Klassenvariable) deklariert

Code: Select all

public class EmailNotificationWorkItemHandler extends AbstractLogOrThrowWorkItemHandler {
private static Utils utils = new Utils();

public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {

// Throw an error due to many missing parameters on the workitem
String id= (String) workItem.getParameter("ID");

...
try {
RequiredParameterValidator.validate(this.getClass(), workItem);
...
} catch (Throwable e) {
utils.insertErrors(id, errorCode, errorMessage, e.getStackTrace(), -1L);  // testing this method called
}

...
}

Mir ist klar, dass ich die Abhängigkeitsinjektion für Utils verwenden könnte, aber ich meide Spring. Beiträge über das Verspotten statischer Felder geben mir das Gefühl, nah dran zu sein:

Code: Select all

@Test
public void executeWorkItemMissingParametersTest() {

Utils mockUtils = mock(Utils.class);
WorkItemManager mockWorkItemMgr = mock(WorkItemManager.class);
EmailNotificationWorkItemHandler mockWorkItemHandler =  mock(EmailNotificationWorkItemHandler.class);

doAnswer(new Answer() {
public Void answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
System.out.println("called with arguments: " + Arrays.toString(args));
return null;
}
}).when(mockUtils).insertErrors(any(), any(), any(), any(), anyLong());

try {
doAnswer(new Answer() {          // Unfinished stubbing detected
public Void answer(InvocationOnMock invocation) {
return null;
}
}).when(mockUtils);
Utils.init();
} catch (Exception e) {
System.out.println("In mocking of Utils.init() " + e.getLocalizedMessage());
}

WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter("ID", "1111-AAAA");
// Lots of required parameters removed to cause an exception and insertErrors to be called

mockWorkItemHandler.executeWorkItem(workItem, mockWorkItemMgr);
verify(mockUtils).insertErrors(any(), any(), contains("RequiredParameterValidator"), any(), anyLong());
}
Aber eine echte Instanz von Utils wird in „mockWorkItemHandler“ verwendet und aufgerufen – nicht die simulierten Utils – und an der oben gekennzeichneten Stelle tritt die Ausnahme „Unvollendetes Stubbing erkannt“ auf. Mein Ziel ist es, den Aufruf von utils.insertErrors wie im Code kommentiert zu testen und dies ohne die Nebenwirkungen von Utils zu tun. Was fehlt mir in meinen Mocks, um (1) ein simuliertes Utils zu verwenden (ohne Nebenwirkungen, wie z. B. Datenbankverbindungen) und (2) zu testen, dass utils.insertErrors von mockWorkItemHandler aufgerufen wird, um die fehlenden Parameter aufzuzeichnen?
Bitte beachten Sie, dass ich scheinbar alle relevanten Teile von EmailNotificationWorkItemHandler und Utils gezeigt habe.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post