Я пытаюсь написать пример модульного теста, чтобы протестировать мой код с помощью некоторого mockito в качестве фреймворк-фреймворка. Между тем я столкнулся с проблемой, когда не могу имитировать инъекцию, которую я сделал с помощью Google Guice в моем тестовом классе.
Я пытался ввести объект напрямую, он работает, но без Google Injection не повезло.
class SomeClassToCreateWiskey{
// Some Service
@Inject
@Named("dataCreation")
DataCreation dataCreation;
public apis(){
Injector injector = Guice.createInjector(new DataCreationModel());
injector.injectMembers(this);
int port = config().getInteger("http.port", 8080);
Router router = Router.router(vertx);
router.route("/api/getAll").handler(this::getAll);
}
// getAll method will return some json result
}
Тестовый класс для тестирования выше API
class SomeClassToCreateWiskeyTest{
@Mock
private DataCreation dataCreation;
// setting up before and after config
@Before
MockitoAnnotations.initMocks(this);
......
@After
......
@Test
public void testGetAll(){
Map<Integer, Whisky> dataSets = new LinkedHashMap<>();
Whisky w1 = new Whisky("Bowmore 15 Years Laimrig", "Scotland, Islay");
Whisky w2 = new Whisky("Talisker 57° kya h", "Scotland, Island");
Async async = context.async();
dataSets.put(w1.getId(), w1);
dataSets.put(w2.getId(), w2);
when(dataCreationDao.getData()).thenReturn(dataSets);
when(dataCreation.getData()).thenReturn(dataSets);
HttpClient client = vertx.createHttpClient();
client.getNow(port, "localhost", "/api/getAll", response -> {
response.bodyHandler(body -> {
System.out.println(body.toString());
client.close();
async.complete();
});
});
}
}
Добавление фактического кода в соответствии с одним из комментариев:
- Проект находится в Vert.x
- Verticle
package com.testproject.starter.verticles;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.name.Named;
import com.testproject.starter.model.DataCreationModel;
import com.testproject.starter.services.DataCreation;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
import io.vertx.core.json.Json;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;
public class ErrorReproduction extends AbstractVerticle {
@Inject
@Named("dataCreation")
DataCreation dataCreation;
//DataCreation dataCreation = new DataCreationImpl();
@Override
public void start(Future<Void> startFuture) throws Exception {
Injector injector = Guice.createInjector(new DataCreationModel());
injector.injectMembers(this);
int port = config().getInteger("http.port", 8080);
Router router = Router.router(vertx);
router.route("/api/getAll").handler(this::getAll);
vertx.createHttpServer().requestHandler(router::accept)
.listen(port,result -> startFuture.complete());
}
public void getAll(RoutingContext routingContext) {
routingContext.response().putHeader("content-type", "application/json")
.end(Json.encodePrettily(dataCreation.getData().values()));
}
}
- Контрольный пример
package com.testproject.starter.verticles;
import com.testproject.starter.dao.DataCreationDao;
import com.testproject.starter.ppojo.Whisky;
import com.testproject.starter.services.DataCreation;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpClient;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.RunTestOnContext;
import io.vertx.ext.unit.junit.VertxUnitRunner;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.LinkedHashMap;
import java.util.Map;
import static org.mockito.Mockito.when;
@RunWith(VertxUnitRunner.class)
public class ErrorReproductionTest {
Vertx vertx;
int port;
@Mock
private DataCreation dataCreation;
@Mock
private DataCreationDao dataCreationDao;
@Rule
public RunTestOnContext rule = new RunTestOnContext();
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@InjectMocks
private ErrorReproduction errVertical;
@Before
public void before(TestContext context) throws IOException {
MockitoAnnotations.initMocks(this);
ServerSocket socket = new ServerSocket(0);
port = socket.getLocalPort();
socket.close();
DeploymentOptions options = new DeploymentOptions()
.setConfig(new JsonObject().put("http.port", port));
vertx = Vertx.vertx();
rule.vertx().deployVerticle(errVertical, options, context.asyncAssertSuccess());
}
@After
public void after(TestContext context) {
vertx.close(context.asyncAssertSuccess());
}
@Test
public void testGetAll(TestContext context){
Map<Integer, Whisky> dataSets = new LinkedHashMap<>();
Whisky w1 = new Whisky("Bowmore 15 Years Laimrig", "Scotland, Islay");
Whisky w2 = new Whisky("Talisker 57° kya h", "Scotland, Island");
Async async = context.async();
dataSets.put(w1.getId(), w1);
dataSets.put(w2.getId(), w2);
when(dataCreationDao.getData()).thenReturn(dataSets);
when(dataCreation.getData()).thenReturn(dataSets);
HttpClient client = vertx.createHttpClient();
client.getNow(port, "localhost", "/api/getAll", response -> {
response.bodyHandler(body -> {
System.out.println(body.toString());
client.close();
async.complete();
});
});
}
}
С этим фрагментом кода не происходит подделка DataCreation, и весь поток кода проходит через вызов функции, и я получаю фактический результат из моего кода, а не по поддельному.