Java 为什么模拟发电机B从maven失败而不是Eclipse?
关于这个问题,我一直在与本书的作者联系,他和我一样困惑不解。简短的故事:我已经编写了针对DynamoDB的代码单元测试,使用了交流发电机模拟框架,当我在Eclipse中调用它们时,这些测试工作正常,但当从maven调用时失败 故障源于AWS SDK本身:Java 为什么模拟发电机B从maven失败而不是Eclipse?,java,amazon-web-services,amazon-dynamodb,alternator,Java,Amazon Web Services,Amazon Dynamodb,Alternator,关于这个问题,我一直在与本书的作者联系,他和我一样困惑不解。简短的故事:我已经编写了针对DynamoDB的代码单元测试,使用了交流发电机模拟框架,当我在Eclipse中调用它们时,这些测试工作正常,但当从maven调用时失败 故障源于AWS SDK本身: com.amazonaws.AmazonServiceException: [java.lang.Error: property value is null.] at com.amazonaws.http.AmazonHttpClien
com.amazonaws.AmazonServiceException: [java.lang.Error: property value is null.]
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:679) ~[aws-java-sdk-1.5.5.jar:na]
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:350) ~[aws-java-sdk-1.5.5.jar:na]
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:202) ~[aws-java-sdk-1.5.5.jar:na]
at com.michelboudreau.alternatorv2.AlternatorDBClientV2.invoke(AlternatorDBClientV2.java:225) ~[alternator-0.6.4.jar:na]
at com.michelboudreau.alternatorv2.AlternatorDBClientV2.updateItem(AlternatorDBClientV2.java:99) ~[alternator-0.6.4.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$2.executeLowLevelRequest(DynamoDBMapper.java:646) ~[aws-java-sdk-1.5.5.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.execute(DynamoDBMapper.java:767) ~[aws-java-sdk-1.5.5.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.save(DynamoDBMapper.java:658) ~[aws-java-sdk-1.5.5.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.save(DynamoDBMapper.java:488) ~[aws-java-sdk-1.5.5.jar:na]
at com.somoglobal.eventdata.Controller.addDeviceKeys(Controller.java:531) ~[classes/:na]
正如您所看到的,这并不是非常有用,因为堆栈跟踪本身只是在AWS SDK组装通过(模拟的)远程服务接收的响应的异常时显示堆栈
相关版本号:
- Maven 3.0.4
- Java 1.7.0_10
- AWS SDK 1.5.5(尽管我也尝试过1.5.3和1.5.4)
- Eclipse版本“开普勒”,构建id:20130614-0229
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>snip</groupId>
<artifactId>snip</artifactId>
<version>1.14.2-SNAPSHOT</version>
</parent>
<artifactId>snip</artifactId>
<version>1.6.0-SNAPSHOT</version>
<name>snip</name>
<dependencies>
...snip...
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>com.michelboudreau</groupId>
<artifactId>alternator</artifactId>
<version>0.6.4</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
剪
剪
1.14.2-快照
剪
1.6.0-快照
剪
剪
亚马逊网站
aws java sdk
1.5.5
com.michelboudreau
交流发电机
0.6.4
测试
以及略显精简的测试:
package com.xxx;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.joda.time.DateTime;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import com.amazonaws.Request;
import com.amazonaws.handlers.RequestHandler;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.CreateTableResult;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughputExceededException;
import com.amazonaws.util.TimingInfo;
import com.michelboudreau.alternator.AlternatorDB;
import com.michelboudreau.alternatorv2.AlternatorDBClientV2;
import com.xxx.stuff;
public class ControllerTest {
private static Controller instance;
private static DynamoDBMapper mapper;
private static AlternatorDB db;
private static AlternatorDBClientV2 client;
@BeforeClass
public static void setup() throws Exception {
client = new AlternatorDBClientV2();
mapper = new DynamoDBMapper(client);
db = new AlternatorDB().start();
// code to create dynamodb was here
instance = new Controller(mapper);
}
@AfterClass
public static void tearDown() throws Exception {
db.stop();
}
@Test
public void testAddDeviceKeys() {
Collection<DeviceKey> keys = EventDataModelMapper.getDeviceKeys(ClassFixtures.event);
assertNotNull("keys should not be null", keys);
assertFalse("keys should not be empty", keys.isEmpty());
boolean result = instance.addDeviceKeys(keys);
assertTrue("result should be true", result);
}
}
package com.xxx;
导入静态org.junit.Assert.assertEquals;
导入静态org.junit.Assert.assertFalse;
导入静态org.junit.Assert.assertNotNull;
导入静态org.junit.Assert.assertTrue;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.Collection;
导入java.util.Collections;
导入java.util.HashSet;
导入java.util.Map;
导入java.util.Set;
导入java.util.UUID;
导入org.joda.time.DateTime;
导入org.junit.AfterClass;
导入org.junit.BeforeClass;
导入org.junit.Rule;
导入org.junit.Test;
导入org.junit.rules.TestRule;
导入com.amazonaws.Request;
导入com.amazonaws.handlers.RequestHandler;
导入com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
导入com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
导入com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
导入com.amazonaws.services.dynamodbv2.model.CreateTableResult;
导入com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
导入com.amazonaws.services.dynamodbv2.model.KeyType;
导入com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
导入com.amazonaws.services.dynamodbv2.model.provisionedthroughoutExceedexception;
导入com.amazonaws.util.TimingInfo;
进口com.michelboudreau.alternator.AlternatorDB;
导入com.michelboudreau.alternatorv2.AlternatorDBClientV2;
导入com.xxx.stuff;
公共类控制器测试{
私有静态控制器实例;
专用静态发电机映射器;
专用静态交流发电机db;
专用静态AlternatorBClientV2客户端;
@课前
public static void setup()引发异常{
client=new AlternatorDBClientV2();
映射器=新的DynamoDBMapper(客户端);
db=新的AlternatorDB().start();
//创建dynamodb的代码就在这里
实例=新控制器(映射器);
}
@下课
public static void tearDown()引发异常{
db.stop();
}
@试验
public void testAddDeviceKeys(){
集合键=EventDataModelMapper.getDeviceKeys(ClassFixtures.event);
assertNotNull(“键不应为null”,键);
assertFalse(“键不应为空”,keys.isEmpty());
布尔结果=instance.addDeviceKeys(键);
资产真实(“结果应真实”,结果);
}
}
测试中的代码可能与此故障无关——我已经做了充分的调试跟踪,以确保在测试期间,当直接通过Eclipse调用时,以及从maven运行时,它的行为是相同的
编辑
实际上,交流发电机可能与此有关,因为相关错误消息可能来自com.michelboudreau.Alternator.validation.ValidatorUtils:
public static <T> List<Error> rejectIfNull(T property) {
List<Error> errors = new ArrayList<Error>();
if (property == null) {
errors.add(new Error("property value is null."));
}
return errors;
}
公共静态列表rejectIfNull(T属性){
列表错误=新建ArrayList();
if(属性==null){
添加(新错误(“属性值为null”);
}
返回错误;
}
好的,停下来,交流发电机没有故障,问题最终出在我工作场所的一把椅子和键盘之间。问题中的错误消息确实是由交流发电机产生的,并最终源于缺少的表定义-由于非常复杂的原因,当通过Maven运行测试时,通过交流发电机创建的模拟Dynamodb表的名称之间存在差异,以及被测试代码试图访问的表名
我想公开感谢米歇尔·布德劳(Michel Boudreau),感谢他在我就此事直接与他联系时抽出时间作出回应。相反,您可以在本地运行亚马逊DynamoDB
相反,您可以使用(我是开发人员)运行DynamoDB Local。这就是我!很高兴你让它工作了。如果可以的话,你应该接受你的答案。未来需要注意的是:很多时候,基于Maven Surefire插件运行的测试顺序与IDE运行的测试顺序的不同,会出现类似的差异。这通常是由修改某种状态的测试引起的,这种状态会延续到后续测试中。