0

Pouvez-vous me dire comment tester la méthode d'édition, je dois faire correspondre deux produits, mais je ne peux pas le faire parce que je ne connaître primaryKey qui est généré de manière aléatoire.Comment tester une méthode quand je ne connais pas l'ID aléatoire qui est primaryKey de l'article de base de données

Ce code est la méthode:

public Product editProduct(PrimaryKey primaryKey, Product content) { 

    Map<String, Object> map = new HashMap<>(); 
    map.put("name", content.getName()); 
    map.put("calories", content.getCalories()); 
    map.put("fat", content.getFat()); 
    map.put("carbo", content.getCarbo()); 
    map.put("protein", content.getProtein()); 
    map.put("productKinds", content.getProductKinds()); 
    map.put("author", content.getAuthor()); 
    map.put("media", content.getMedia()); 
    map.put("approved", content.getApproved()); 

    UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey(primaryKey).withValueMap(map); 

    UpdateItemOutcome itemOutcome = databaseController.getTable(PRODUCT_TABLE).updateItem(updateItemSpec); 


    Product product = new Product(); 
    product.setName(itemOutcome.getItem().get("name").toString()); 
    product.setCalories(itemOutcome.getItem().getInt("calories")); 
    product.setFat(itemOutcome.getItem().getDouble("fat")); 
    product.setCarbo(itemOutcome.getItem().getDouble("carbo")); 
    product.setProtein(itemOutcome.getItem().getDouble("protein")); 
    product.setProductKinds(itemOutcome.getItem().getList("productKinds")); 

    ObjectMapper objectMapper = new ObjectMapper(); 
    try { 
     Author productAuthor = objectMapper.readValue(itemOutcome.getItem().getString("author"), Author.class); 
     product.setAuthor(productAuthor); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     Media productMedia = objectMapper.readValue(itemOutcome.getItem().getString("media"), Media.class); 
     product.setMedia(productMedia); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return product; 
} 

Je pense que je l'ai fait bien, mais si vous voyez quelque chose de mal s'il vous plaît me dire que. Je suis Begginer et je n'ai jamais utilisé AWS auparavant.

Et voici le code de test:

@Test 
public void editProduct() throws Exception { 

    KitchenService instance = new KitchenService(databaseControllerMock, loggerMock); 

    //TODO prepare expected product fields 
    Product expectedProduct = new Product(); 
    Map<String, Object> map = new HashMap<>(); 
    map.put("name", expectedProduct.getName()); 
    map.put("calories", expectedProduct.getCalories()); 
    map.put("fat", expectedProduct.getFat()); 
    map.put("carbo", expectedProduct.getCarbo()); 
    map.put("protein", expectedProduct.getProtein()); 
    map.put("productKinds", expectedProduct.getProductKinds()); 
    map.put("author", expectedProduct.getAuthor()); 
    map.put("media", expectedProduct.getMedia()); 
    map.put("approved", expectedProduct.getApproved()); 



    //TODO prepare argument product 
    Product productToSave = new Product(); 
    productToSave.setName("kaszanka"); 
    productToSave.setCalories(1000); 
    productToSave.setFat(40.00); 
    productToSave.setCarbo(20.00); 
    productToSave.setProtein(40.00); 
    productToSave.setProductKinds(Collections.singletonList(ProductKind.MEAT)); 
    productToSave.setApproved(false); 
    Author author = new Author(); 
    author.setId("testID"); 
    author.setName("Endrju Golota"); 
    productToSave.setAuthor(author); 
    Media media = new Media(); 
    media.setMediaType(MediaType.IMAGE); 
    media.setName("dupajasia"); 
    media.setUrl("http://blabla.pl"); 
    productToSave.setMedia(media); 



    UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey(primaryKey).withValueMap(map); 

    UpdateItemOutcome itemOutcome = databaseControllerMock.getTable("product").updateItem(updateItemSpec); 


    when(databaseControllerMock.update(any(Item.class))).thenReturn(itemOutcome); 

    Product actualProduct = instance.editProduct(productToSave); 

    assertEquals(expectedProduct, actualProduct); 

} 

J'ai beaucoup de problèmes avec les tests mais je learing encore comment faire ce droit, ne soyez pas impoli si vous voyez quelque chose de ridicule dans mon code ...

Répondre

0

Vous ne devriez pas vous opposer à quelque chose d'imprévisible. Au lieu d'utiliser assertEquals pour comparer l'objet entier, vous pouvez simplement tester chaque champ prévisible avec de nombreux assertEquals.

La façon dont votre méthode editProduct est en ce moment n'est pas testable à l'unité. Je casserais votre méthode editProduct en plus petits. Quelque chose comme:

public Product editProduct(PrimaryKey primaryKey, Product content) { 

    UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey(primaryKey).withValueMap(createMap(content)); 

    UpdateItemOutcome itemOutcome = databaseController.getTable(PRODUCT_TABLE).updateItem(updateItemSpec); 

    return toProduct(itemOutcome); 

} 

public Map<String, Object> createMap(Product content) { 

    Map<String, Object> result = new HashMap<>(); 

    result.put("name", content.getName()); 
    result.put("calories", content.getCalories()); 
    result.put("fat", content.getFat()); 
    result.put("carbo", content.getCarbo()); 
    result.put("protein", content.getProtein()); 
    result.put("productKinds", content.getProductKinds()); 
    result.put("author", content.getAuthor()); 
    result.put("media", content.getMedia()); 
    result.put("approved", content.getApproved()); 

    return result; 
} 

public Product toProduct(UpdateItemOutcome outcome) { 

    Product product = new Product(); 
    product.setName(itemOutcome.getItem().get("name").toString()); 
    product.setCalories(itemOutcome.getItem().getInt("calories")); 
    product.setFat(itemOutcome.getItem().getDouble("fat")); 
    product.setCarbo(itemOutcome.getItem().getDouble("carbo")); 
    product.setProtein(itemOutcome.getItem().getDouble("protein")); 
    product.setProductKinds(itemOutcome.getItem().getList("productKinds")); 

    ObjectMapper objectMapper = new ObjectMapper(); 
    try { 
     Author productAuthor = objectMapper.readValue(itemOutcome.getItem().getString("author"), Author.class); 
     product.setAuthor(productAuthor); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     Media productMedia = objectMapper.readValue(itemOutcome.getItem().getString("media"), Media.class); 
     product.setMedia(productMedia); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return product; 

} 

Vous unité pourrait tester les méthodes plus petites et toProduct createMap pour voir si elles se comportent comme prévu. Et comme vous l'avez dit dans votre commentaire, vous devez vous moquer de la base de données puisqu'il s'agit d'un test unitaire.

+0

Maintenant, je vois que je ne peux pas comparer des champs ou des objets entiers parce que je ne peux pas obtenir l'élément de base de données qui est raillé .. alors comment je suppose pour tester la méthode comme ça? –

+0

J'ai édité la réponse avec une suggestion sur comment vous devriez le tester. – BrenoQ