模拟jndi连接
Mock jndi connection
我在静态服务中模拟我的 jndi 连接时遇到了一点问题。我正在使用 jersey 1.9 为我的测试创建 web 服务 rest 和 mockito。
我的测试代码:
//Mock DATA
db = Mockito.mock(Transactions.class);
Comp comp = Mockito.mock(Comp.class);
Mockito.when(db.createConnection()).thenReturn(connection);
Mockito.when(db.getComponent(connection, comp)).thenReturn(new Comp());
Mockito.doNothing().when(connection).commit();
Mockito.doNothing().when(connection).close();
//Get class at the context
configs = ConfigDatabaseTests.getInstance();
configs.setUpClass();
configs.bindNewSubContext("java:/comp/env/rest");
configs.bindNewInstance(new WSCompRest(db), "java:/comp/env/rest/ws");
webService = (WSCompRest) configs.getTheInstance("java:/comp/env/rest/ws");
String jsonComp = "{\n"
+ " \"comp\": {\n"
+ " \"model\": \"XPTOXXX\",\n"
+ " \"id\": \"TTTT\",\n"
+ " \"type\": \"XXXXXX\"\n"
+ " }\n"
+ "}";
//END Mock DATA
webService.createComp(jsonComp);
此时我没有任何问题,调用了 webService,我可以调试该方法。
@POST
@Path("/create")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response createComp(String comp) throws AppException {
Response response = null;
RequestHelper rqHelper = new RequestHelper();
Comp com = new Comp();
try {
//Check parameters
if (!rqHelper.validParameters(comp)) {
throw new AppException(Response.Status.BAD_REQUEST.getStatusCode(), "Invalid json!!");
}
...
Connection conn = db.createConnection();
try {
//Get the type
//WHYYYYYYYYY?
comp = db.getComponent(conn, comp);
...
我不明白为什么方法 getComponent(...) return 是一个空实例...有人知道这个的解决方案吗?
我已经使用此策略 https://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit 测试了所有 Transaction.class 方法,但我喜欢在高级别测试代码。
如果我使用 spring 测试服务比 jersey 更容易?我对此表示质疑,因为在 spring 可以使用 xml 文件注入 jndi。
谢谢大家,抱歉我的英语不好:(
此致
它 return 是空的,因为当你设置你的模拟时,你指定该方法应该只 return 一个 new Comp()
如果它是用 2 个特定对象调用的(connection
和 comp
):
Mockito.when(db.getComponent(connection, comp)).thenReturn(new Comp());
您的 comp
变量在测试代码中是模拟的,但在您的非测试代码中,您使用真实的 Comp
实例调用该方法。我想你真正想要的是在任何时候调用这个值的方法return,你应该做这样的事情;
Mockito.when(db.getComponent(any(Connection.class), any(Comp.class)).thenReturn(new Comp());
我在静态服务中模拟我的 jndi 连接时遇到了一点问题。我正在使用 jersey 1.9 为我的测试创建 web 服务 rest 和 mockito。
我的测试代码:
//Mock DATA
db = Mockito.mock(Transactions.class);
Comp comp = Mockito.mock(Comp.class);
Mockito.when(db.createConnection()).thenReturn(connection);
Mockito.when(db.getComponent(connection, comp)).thenReturn(new Comp());
Mockito.doNothing().when(connection).commit();
Mockito.doNothing().when(connection).close();
//Get class at the context
configs = ConfigDatabaseTests.getInstance();
configs.setUpClass();
configs.bindNewSubContext("java:/comp/env/rest");
configs.bindNewInstance(new WSCompRest(db), "java:/comp/env/rest/ws");
webService = (WSCompRest) configs.getTheInstance("java:/comp/env/rest/ws");
String jsonComp = "{\n"
+ " \"comp\": {\n"
+ " \"model\": \"XPTOXXX\",\n"
+ " \"id\": \"TTTT\",\n"
+ " \"type\": \"XXXXXX\"\n"
+ " }\n"
+ "}";
//END Mock DATA
webService.createComp(jsonComp);
此时我没有任何问题,调用了 webService,我可以调试该方法。
@POST
@Path("/create")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response createComp(String comp) throws AppException {
Response response = null;
RequestHelper rqHelper = new RequestHelper();
Comp com = new Comp();
try {
//Check parameters
if (!rqHelper.validParameters(comp)) {
throw new AppException(Response.Status.BAD_REQUEST.getStatusCode(), "Invalid json!!");
}
...
Connection conn = db.createConnection();
try {
//Get the type
//WHYYYYYYYYY?
comp = db.getComponent(conn, comp);
...
我不明白为什么方法 getComponent(...) return 是一个空实例...有人知道这个的解决方案吗? 我已经使用此策略 https://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit 测试了所有 Transaction.class 方法,但我喜欢在高级别测试代码。
如果我使用 spring 测试服务比 jersey 更容易?我对此表示质疑,因为在 spring 可以使用 xml 文件注入 jndi。
谢谢大家,抱歉我的英语不好:( 此致
它 return 是空的,因为当你设置你的模拟时,你指定该方法应该只 return 一个 new Comp()
如果它是用 2 个特定对象调用的(connection
和 comp
):
Mockito.when(db.getComponent(connection, comp)).thenReturn(new Comp());
您的 comp
变量在测试代码中是模拟的,但在您的非测试代码中,您使用真实的 Comp
实例调用该方法。我想你真正想要的是在任何时候调用这个值的方法return,你应该做这样的事情;
Mockito.when(db.getComponent(any(Connection.class), any(Comp.class)).thenReturn(new Comp());