Junit Testing模拟服务并过滤结果

时间:2017-07-25 00:35:31

标签: java testing junit mockito amazon-dynamodb

我想测试以下功能(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));
            });


});

如何测试这个简单的功能?我真的可以使用一些帮助来解决这个问题。我怎样才能使用"当"这里?我尝试在线浏览示例代码,但不太了解。

3 个答案:

答案 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,....)