2014-06-09 4 views
5

Jestem nowy na wiosnę i tylko nieco doświadczony z JUnit i MockitoWiosna jdbcTemplate testowanie jednostkowe

Mam następującą metodę, która wymaga testów jednostkowych

public static String getUserNames(final String userName { 
    List<String> results = new LinkedList<String>(); 
    results = service.getJdbcTemplate().query("SELECT USERNAME FROM USERNAMES WHERE NAME = ?", new RowMapper<String>() { 
     @Override 
     public String mapRow(ResultSet rs, int rowNum) throws SQLException { 
      return new String(rs.getString("USERNAME"); 
     } 
    } 

    return results.get(0);  
    },userName) 

Czy ktoś ma jakieś sugestie, w jaki sposób mógłbym osiągnąć to za pomocą JUnit i Mockito?

Dziękuję bardzo z góry!

+1

Musisz zdefiniować kontekst aplikacji testowej, w którym zostanie wybrany przez SpringJUnit4ClassRunner. Jak widzę, próbujesz przeprowadzić test integracyjny, a nie test jednostkowy. To są dwie różne rzeczy. – Vaelyr

+1

jakie aspekty metody chcesz przetestować?Jakie testy próbowaliście napisać? Pokaż trochę pracy. –

+0

Możesz przyjrzeć się ramom [Acolyte] (http://acolyte.eu.org/) testów jednostkowych JDBC – cchantep

Odpowiedz

7

Jeśli chcesz zrobić test jednostkowy czystego następnie do linii

service.getJdbcTemplate().query("...."); 

Trzeba będzie szydzić z Usługi, potem service.getJdbcTemplate (), aby zwrócić pozorowany obiekt JdbcTemplate, a następnie sfałszować metodę zapytania wyśmianego JdbcTemplate, aby zwrócić listę, której potrzebujesz. Coś takiego:

@Mock 
Service service; 

@Mock 
JdbcTemplate jdbcTemplate; 


@Test 
public void testGetUserNames() { 

    List<String> userNames = new ArrayList<String>(); 
    userNames.add("bob"); 

    when(service.getJdbcTemplate()).thenReturn(jdbcTemplate); 
    when(jdbcTemplate.query(anyString(), anyObject()).thenReturn(userNames); 

    String retVal = Class.getUserNames("test"); 
    assertEquals("bob", retVal); 
} 

Powyższe nie wymaga żadnego wsparcia Spring. Jeśli wykonywałeś test integracji, w którym rzeczywiście chciałeś przetestować, czy dane zostały wyciągnięte z DB poprawnie, to prawdopodobnie chciałbyś skorzystać z Spring Test Runner.

+0

Dziękuję wxkevin :) – Mat

+0

Jestem uzyskanie następującego wyjątku. Śledziłem to samo. http://stackoverflow.com/questions/38374823/spring-jdbctemplate-junit – Javadroider

1

Do tego celu należy użyć testu sprężynowania. Spójrz na dokumentację:

http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/testing.html

Musisz utworzyć test używając @RunWith i użyć sprężyny conf z @ContextConfiguration:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:spring-config.xml") 
public class SpringAppTests { 
    @Autowired 
    private HelloService helloService; 

    @Test 
    public void testSayHello() { 
     Assert.assertEquals("Hello world!", helloService.sayHello()); 
    } 
} 

Tu masz trochę wyjaśnień od dokumentacji :

@Runwith

@Runwith (SpringJUnit4ClassRunner.class), twórcy może stosować standardowe JUnit 4,4 jednostek integracyjnych i badania, a jednocześnie czerpać korzyści z ram TestContext takie jak wsparcie dla ładowania kontekstu aplikacji, wstrzyknięcie zależności przypadków badań, transakcyjnego metody badania wykonanie itp

@ContextConfiguration

@ContextConfiguration Definiuje metadane poziomu klasy, który jest używany do określają sposób ładowania i konfigurowania testu integracji aplikacji ApplicationContext for . W szczególności @ContextConfiguration deklaruje położenia zasobów kontekstu aplikacji lub przypisanych klas , które zostaną użyte do załadowania kontekstu. Nadzieję, że pomoże

nadzieję pomóc

+0

Dziękuję Fede .. Myślę, że muszę być bardziej szczegółowy o tym, co chcę osiągnąć ... Chcę wiedzieć, czy jest możliwe, aby Mock powrót metody jdbcTemplate.query z JUnit i Mockito ... Dziękuję – Mat

+0

@ Przykro mi za missunderstand potrzebne. Jeśli chcesz, mogę usunąć odpowiedź. Btw, w takim przypadku potrzebujesz mockito, możesz zajrzeć na tę stronę http://gojko.net/2009/10/23/mockito-in-six-easy-examples/ –