JMockit Fakes
If you are working with microservices, you may find that you are having a lot of dependencies on other services. If you want your tests to be autonomous, that is, running in isolation of those dependencies, you can either use a tool like WireMock, or you can use a mocking framework.
Recently, I came across JMockit, a mocking framework for Java.
To mock external dependencies, you can use so-called “fakes”. Say you use a
service that knows the credentials of the customers of your e-store, and you
make requests to this service by using a driver provided by this service, say
CredentialsHttpService
. In your development environment (and Jenkins), you
don’t have access to a running service. A solution to this would be a fake
implementation of CredentialsHttpService
, where we would mock the methods that
we actually call from our code.
public class CredentialsHttpService {
...
public Optional<CustomerAccount> getCustomerAccount(String id) {
// does HTTP request to service
}
...
}
In our test code, we can now implement the fake:
public class ServiceTest {
@Tested
Service service;
@Test
void test() {
new MockUp<CredentialsHttpService>() {
final static AtomicInteger counter = new AtomicInteger();
@Mock
Optional<CustomerAccount> getCustomerAccount(String id) {
return Optional.of(CustomerAccount.builder()
.accountNumber(counter.incrementAndGet())
.build());
}
}
service.doFoo(); // eventually invokes our fake
// getCustomerAccount() implementation
}
}
The class to be faked is the type parameter of the MockUp
class. The
fake CredentialsHttpService
will only mock the methods that are
annotated with @Mock
. All other methods of the faked class will have
their real implementation. Mocked methods are not restricted by access
modifiers: the method may have a private, protected, package-private or
public access modifier, as long as the method name and number of
parameters and parameter types are the same.
There is a lot of other things that fakes can do in JMockit, see the documentation.