Ich versuche, eine Dienstklasse zu testen, die intern ein Spring-AMQP-Verbindungsobjekt verwendet. Dieses Verbindungsobjekt wird von Spring injiziert. Ich möchte jedoch nicht, dass mein Komponententest tatsächlich mit dem AMQP-Broker kommuniziert, also verwende ich Mockito, um einen Schein des Verbindungsobjekts einzufügen.
/**
* The real service class being tested. Has an injected dependency.
*/
public class UserService {
@Autowired
private AmqpTemplate amqpTemplate;
public final String doSomething(final String inputString) {
final String requestId = UUID.randomUUID().toString();
final Message message = ...;
amqpTemplate.send(requestId, message);
return requestId;
}
}
/**
* Unit test
*/
public class UserServiceTest {
/** This is the class whose real code I want to test */
@InjectMocks
private UserService userService;
/** This is a dependency of the real class, that I wish to override with a mock */
@Mock
private AmqpTemplate amqpTemplateMock;
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testDoSomething() {
doNothing().when(amqpTemplateMock).send(anyString(), any(Message.class));
// Call the real service class method, which internally will make
// use of the mock (I've verified that this works right).
userService.doSomething(...);
// Okay, now I need to verify that UUID string returned by
// "userService.doSomething(...) matches the argument that method
// internally passed to "amqpTemplateMock.send(...)". Up here
// at the unit test level, how can I capture the arguments passed
// to that inject mock for comparison?
//
// Since the value being compared is a UUID string created
// internally within "userService", I cannot just verify against
// a fixed expected value. The UUID will by definition always be
// unique.
}
}
Die Kommentare in diesem Codebeispiel stellen die Frage hoffentlich klar dar. Wenn Mockito eine Scheinabhängigkeit in eine reale Klasse einfügt und Komponententests für die reale Klasse dazu führen, dass sie Aufrufe an die Scheinstruktur tätigt, wie können Sie dann später die genauen Argumente abrufen, die an die eingefügte Scheinklasse übergeben wurden?