2017-10-02 3 views
0

J'essaie de simplifier un 1er bloc de code d'un cas de test à quelque chose de similaire montré dans le 2ème bloc de code. J'ai deux questions:Comment créer et affirmer une liste Mockito d'objet personnalisé?

  1. Puis-je mocker une liste d'objets personnalisés? Puis-je affirmer une liste mockée d'objets personnalisés avec les champs d'une liste d'objets retournée?

Quelque chose de similaire est-il réalisable?

@Test 
    public void testStudentSuccess() { 
    Student st = new Student(); 
     st.setRollNumber("1234"); 
     st.setFeeAmount("1000"); 
     List<Student> stList = new ArrayList<Student>(); 
     stList.add(st); 
     Map<String, Object> simpleJdbcCallResult = new HashMap<String, Object>(); 
     simpleJdbcCallResult.put("X_GET_DATA", stList); 
     when(simpleJdbcCall.getSimpleJdbcCall(any(String.class), any(String.class), any(String.class), 
         any(String.class), any(String.class), any(String.class), any(String.class), any(String.class), 
         any(StudentRowMapper.class))).thenReturn(simpleJdbcCallResult); 
     List<Student> studentList = opusPackageRepo.getPolicyStudent("123", "123"); 
     Student student = studentList.get(0); 
     assertEquals(student.getRollNumber(), "1234"); 
     assertEquals(student.getFeeAmount(), "1000"); 
    } 

Pour quelque chose comme ça (voir les commentaires -> //):

@Test 
    public void testStudentSuccess() { 
     List<Student> stList = Mockito.mock(new ArrayList<Student>()); // 1. IS SOMTHING SIMILAR TO THIS POSSIBLE? 
     Map<String, Object> simpleJdbcCallResult = new HashMap<String, Object>(); 
     simpleJdbcCallResult.put("X_GET_DATA", Mockito.mock(new ArrayList<Student>())); 
     when(simpleJdbcCall.getSimpleJdbcCall(any(String.class), any(String.class), any(String.class), 
         any(String.class), any(String.class), any(String.class), any(String.class), any(String.class), 
         any(StudentRowMapper.class))).thenReturn(simpleJdbcCallResult); 
     List<Student> studentList = opusPackageRepo.getPolicyStudent("123", "123"); 
     assertEquals(studentList, stList); // 2. CAN I ASSERT EQUALS A MOCK WITH A RETURNED LIST? 
    } 
+0

La seule chose qui vaut la peine de se moquer ici est opusPackageRepo. Quel est le point de se moquer d'une liste ici –

+0

Je pense que la réponse ci-dessous par @glitch était ce que je cherchais - "Votre test n'a pas besoin de connaître le contenu de cette liste" – nanospeck

Répondre

1

Dans le test original dans votre OP vous créez un résultat attendu pour le simpleJdbcCall.getSimpleJdbcCall() comme suit:

Student st = new Student(); 
st.setRollNumber("1234"); 
st.setFeeAmount("1000"); 
List<Student> stList = new ArrayList<Student>(); 
stList.add(st); 
Map<String, Object> simpleJdbcCallResult = new HashMap<String, Object>(); 
simpleJdbcCallResult.put("X_GET_DATA", stList); 

Ensuite, vous affirmez que le résultat (auquel opusPackageRepo.getPolicyStudent() doit accéder via la touche "X_GET_DATA") correspond à vos attentes:

Student student = studentList.get(0); 
assertEquals(student.getRollNumber(), "1234"); 
assertEquals(student.getFeeAmount(), "1000"); 

Vous pouvez simplfy cela sans qu'il soit nécessaire de penser à se moque ...

List<Student> expected = new ArrayList<Student>(); 
Map<String, Object> simpleJdbcCallResult = new HashMap<String, Object>(); 
simpleJdbcCallResult.put("X_GET_DATA", expected); 

... 

List<Student> actual = opusPackageRepo.getPolicyStudent("123", "123"); 
assertSame(expected, actual); 

Cela permet de vérifier que le résultat retourné par getPolicyStudentest la même que celle retournée par l'invocation simpleJdbcCall.getSimpleJdbcCall().

Votre test n'a pas besoin de connaître le contenu de cette liste depuis votre test est simplement préoccupé de vérifier que la liste renvoyée par simpleJdbcCall.getSimpleJdbcCall() est correctement transmis par getPolicyStudent lecture de cette clé: "X_GET_DATA". I pense c'est ce que vous avez laissé entendre lorsque vous avez écrit "simplifier un cas de test" et il peut être facilement fait, mais il n'a pas besoin de moquer.