2015-11-20 6 views
0

Я просто разбираюсь в коде. Я уже делал модульные тесты, но на самом деле их не изолировал. Поэтому они больше походили на интеграционный тест (косвенно). Я хочу дать Mockito попробовать, и я добавил его в свою Intellij IDE. Но я понятия не имею, как на самом деле реализовать насмешку вообще. На их веб-сайте есть примеры, но я просто не могу окунуться в концепцию насмешки. Я знаю, что один из насмехается, чтобы изолировать модульное тестирование, чтобы убедиться, что ошибки находятся в самом блоке, а не в зависимости.Mocking DAO в Mockito

я написал следующее:

@Test 
public void testChangeMemberReturnsTrue() throws Exception { 
    Member tempMem = new Member(); 
    tempMem.setMemberFirstName("Swagrid"); 
    tempMem.setMemberLastName("McLovin"); 
    tempMem.setMemberID("SM666"); 

    SQLDUMMY.saveMember(tempMem);    //Save member to dummy DB. 

    Member checkMem = new Member(); 
    ArrayList<Member> memArr = SQLDUMMY.getAllMembers(); 
    for (Member m : memArr) {     // Look through all saved members 
     if (m.equals(tempMem)) {    // If match, save to checkMem 
      checkMem = m; 
     } 
    } 
    assertTrue(tempMem.equals(checkMem));   // Make sure they are really equal. 

    String newfirstname = "Darius"; 
    String newlastname = "DunkMaster"; 
    assertTrue(memhandling.changeMember(tempMem, newfirstname, newlastname)); 

} 

А вот фактический метод:

public boolean changeMember(Member mem, String n1, String n2) { 
    try { 
     ArrayList<Member> memArr = SQLDUMMY.getAllMembers(); 
     for (Member m : memArr) { 
      if (m.equals(mem)) { 
       m.setMemberFirstName(n1); 
       m.setMemberLastName(n2); 
       m.setMemberID(ensureUniqueID(m, m.getMemberID())); //Just a method call to another method in the same class to ensure ID uniqueness. 
       return true; 
      } 
      else { 
       return false; 
      } 
     } 
    } 
    catch (Exception e) { 
     System.out.println("Error4."); 
    } 
    return false; 
} 

Я хотел бы, чтобы дразнить SQLDUMMY (который я создал, чтобы посмотреть, если мои испытания будут проходить . на все, что они делают) класс SQLDUMMY выглядит следующим образом:

public class SQLDUMMY { 

private static ArrayList<Member> memberList = new ArrayList<>(); 
private static ArrayList<Ship> shipList = new ArrayList<>(); 

public static ArrayList<Member> getAllMembers() { 
    return memberList; 
} 

public static void saveMember(Member m) { 
    memberList.add(m); 
} 

public static void deleteMember(Member memIn) { 
    memberList.remove(memIn); 
} 


public static void saveShip(Ship newShip) { 
    shipList.add(newShip); 
} 

public static ArrayList<Ship> getAllShips() { 
    return shipList; 
} 

public static void deleteShip(Ship s) { 
    shipList.remove(s); 
} 

}

Он в основном состоит из геттеров и добавляет/удаляет для ArrayLists, которые выступают в качестве современного хранилища БД.

Резюме: Как я могу высмеять класс SQLDUMMY (DAO), чтобы он больше не зависел от тестов Unit?

ответ

2

Вам необходимо прочитать о том, как работает Mockito. Основная идея состоит в том, что он расширяет ваш класс и отменяет все методы и позволяет вам вернуть то, что вы хотите.

Синтаксис:

SQLDummy sqlDummy = Mockito.mock(SQLDummy.class); 
Mockito.when(sqlDummy.getAllShips()).thenReturn(new ArrayList<Ship>()) 
+0

Великий пример. Я также рекомендую Mockito javadoc, который имеет большой учебник в обзоре: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html –

+0

Абсолютно замечательно! Я получаю это сейчас. Я не понимал, что они означают, создавая экземпляр уже существующего класса и вызывая его и возвращая ожидаемое значение. Теперь я понимаю, что они имели в виду. (Это так просто, когда у вас есть пример, связанный с вашей проблемой.) Еще раз спасибо! – Danny

Смежные вопросы