我想测试以下功能(Junit测试)。我正在使用Mockito模拟Dynamodao服务(它从dynamodb获取项目)。我正在根据所有者名称过滤项目。
@Mock
private DynamoDao dynamoDao;
这里MapData是一个将Owner作为dynamodbattribute的类。我读到了Mockito,并意识到我需要它来模拟服务。
$('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: ''
},
navLinks: true,
timeFormat: 'h:mm A',
editable: true,
eventLimit: true,
eventOrder: "-sorting",
events: [
/* Lot of Events Here */
],
eventRender: function(event, element) {
$(element).hide();
$(".fc-day").on('click',function(){
console.log($(this));
});
});
如何测试这个简单的功能?我真的可以使用一些帮助来解决这个问题。我怎样才能使用"当"这里?我尝试在线浏览示例代码,但不太了解。
答案 0 :(得分:1)
因此,被测试的类有一个方法,其中包含您在上面显示的几行代码。另外,我假设,DynamoDao
的一个实例可能通过构造函数注入到这个类中。
考虑到这些假设,您的测试用例可能如下所示:
@RunWith(MockitoJunitRunner.class)
public class MyTest {
@Mock
private DynamoDao dynamoDao;
@Test
public void testSomething() {
// create an instance of MapData which matches the behaviour expected of this test
List<MapData> expectedResult = ...;
when(dynamoDao.getAllRecords(re(TABLE_NAME), eq(Regions.US_WEST_2))).thenReturn(expectedResult);
// now invoke your method i.e. the one from which the extract in your question is taken
// now add assertions which match how you expect your method to behave when dynamoDao returns the expectedResult you created above
}
}
所以,简单地说:
答案 1 :(得分:1)
请勿模拟您的DynamoDB客户端。您是否要模拟所有DynamoDB方法以确保您的模拟完全实现DynamoDB行为以及所有次要细节?您是否要返回DynamoDB协议返回的确切返回值?如果要添加事务或乐观锁定怎么办?您是否也会模拟这些细节并抛出正确的异常并返回正确的值?
实现内存中的DynamoDB客户端是一个很大的项目,每当你犯一个小错误时,你就会陷入痛苦的世界。因此,不要嘲笑它,只需使用existing in-memory DynamoDB from AWS。
您需要做的就是让DynamoDAO可配置,因此您可以将任何DynamoDB客户端传递给它,如:
class DynamoDAO {
public DynamoDAO(AmazonDynamoDB dynamoDB) {
this.dynamoDB = dynamoDB
}
}
然后在测试中,您可以创建嵌入式内存中DynamoDB实例并根据需要使用它:
AmazonDynamoDB dynamodb = DynamoDBEmbedded.create().amazonDynamoDB();
DynamoDAO dao = new DynamoDAO(dynamodb);
// Write your tests here ...
P.S。如果您使用的是Maven,则需要添加以下内容:
<!-- Local DynamoDB depends on sqlite4java -->
<dependency>
<groupId>com.almworks.sqlite4java</groupId>
<artifactId>sqlite4java</artifactId>
<version>1.0.392</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.almworks.sqlite4java</groupId>
<artifactId>sqlite4java-win32-x86</artifactId>
<version>1.0.392</version>
<type>dll</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.almworks.sqlite4java</groupId>
<artifactId>sqlite4java-win32-x64</artifactId>
<version>1.0.392</version>
<type>dll</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.almworks.sqlite4java</groupId>
<artifactId>libsqlite4java-osx</artifactId>
<version>1.0.392</version>
<type>dylib</type>
<scope>test</scope>
</dependency>
<!-- Local DynamoDB dependency -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>DynamoDBLocal</artifactId>
<version>1.11.0.1</version>
<scope></scope>
</dependency>
<!-- Repository for local DynamoDB -->
<repositories>
<repository>
<id>dynamodb-local</id>
<name>DynamoDB Local Release Repository</name>
<url>https://s3-us-west-2.amazonaws.com/dynamodb-local/release</url>
</repository>
</repositories>
<!-- Copy native libraries for sqlite to your project on build so you can access them -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy</id>
<phase>test-compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<includeScope>test</includeScope>
<includeTypes>so,dll,dylib</includeTypes>
<outputDirectory>${project.basedir}/libs</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
答案 2 :(得分:0)
注意:如果你想测试针对dynamodb的过滤器表达式是否看到@Ivan Mushketyk出色的答案。
注意我不知道有关dynamodb或mockito的任何信息。
如果你想测试使用dynamodb的代码,那么我将如何进行测试:
隐藏存储库界面外观背后的dynamodb特定代码,并仅在代码中使用该存储库
interface IRepository {
List<MapData> findMapData(...);
}
List<MapData> result1 = myRepository.findMapData(
owner, TABLE_NAME, Regions.US_WEST_2)
IRepository
有两种实现:一种调用dynamodb,另一种模拟/模拟dynamodb。
我通常通过从findXXX参数创建text-filename来实现我的模拟,并返回转换后的textfile / resourcefile内容。
示例:模拟的myRepository.findMapData(&#34; smith&#34;,&#34; customer&#34;,Regions.US_WEST_2)从文件中加载xml ... testdata / smith_customer_west2.xml转换为{ {1}}并返回。
为您的模拟数据使用人类可读格式,可以轻松转换为内部对象模型。 (即xml,json,csv,....)