2017-07-25 79 views
0

我想測試以下函數(Junit測試)。我正在使用Mockito來模擬Dynamodao服務(它從dynamodb獲取物品)。我正在根據所有者名稱篩選項目。Junit測試模擬服務和篩選結果

owner = this.getUser(httpRequest); 
List<MapData> result = this.dynamoDao.getAllRecords(TABLE_NAME, Regions.US_WEST_2); 
List<MapData> result1 = result.stream().filter(x -> owner.equals(x.getOwner())) 
          .collect(Collectors.toList()); 

這裏MapData是一個擁有Owner作爲dynamodbattribute的類。我閱讀了Mockito,意識到我需要它來嘲笑這項服務。

@Mock 
private DynamoDao dynamoDao; 

我該如何測試這個簡單的功能?我真的可以使用一些幫助如何繼續。我怎樣才能在這裏使用「when」?我嘗試通過網上的示例代碼,但不太瞭解。

回答

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 
    } 
} 

所以,簡單地:

  • 註釋類,以確保模擬被初始化
  • 注入模擬成被測類
  • 告訴模擬返回的一些數據可以讓你指導模擬的行爲
  • 調用方法被測
  • 斷言方法被測正確行爲
+0

謝謝。我如何處理結果1即過濾器部分?目前的結果給了我paginatedscanlist參考和result1有實際的數據內容 –

+0

你能否更新你的問題來澄清這個評論?也許在您對原始問題的答案做出任何更改後,向我們展示您的最新代碼。 – glytching

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 ... 

PS如果您正在使用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> 
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參數創建一個文本文件名來實現我的模擬並返回轉換後的textfile/resourcefile內容。例如:模擬的myRepository.findMapData(「smith」,「customer」,Regions.US_WEST_2)從文件... testdata/smith_customer_west2.xml中加載xml,並將其轉換爲List<MapData>並返回。

爲您的模擬數據使用可讀的格式,可以很容易地轉換爲內部對象模型。 (即xml,json,csv,...)