web-dev-qa-db-ja.com

Spring jdbcTemplate単体テスト

私はSpringを初めて使用し、JUnitとMockitoの使用経験はわずかです

単体テストが必要な次の方法があります

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)

JUnitとMockitoを使用してこれを実現する方法について何か提案はありますか?

事前にどうもありがとうございました!

7
Mat

純粋な単体テストを行いたい場合は、ライン

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

サービスをモックし、次にservice.getJdbcTemplate()メソッドでモックJdbcTemplateオブジェクトを返し、モックしたJdbcTemplateのクエリメソッドをモックして必要なリストを返す必要があります。このようなもの:

@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);
}

上記では、Springのサポートは一切必要ありません。データがDBから適切にプルされていることを実際にテストしたい統合テストを行っている場合は、おそらくSpring Test Runnerを使用する必要があります。

16
wxkevin

これを行うには、Spring Testを使用する必要があります。ドキュメントを見てください:

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

@RunWithを使用してテストを作成し、@ ContextConfigurationでSpring confを使用する必要があります。

@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());
    }
}

ここでは、ドキュメントから少し説明があります:

@ Runwith

@Runwith(SpringJUnit4ClassRunner.class)を使用すると、開発者は標準のJUnit 4.4ユニットテストと統合テストを実装でき、同時にアプリケーションコンテキストのロードのサポート、テストインスタンスの依存性注入、トランザクションテストメソッドの実行など、TestContextフレームワークのメリットを享受できます。

@ ContextConfiguration

@ContextConfiguration統合テストのApplicationContextをロードして構成する方法を決定するために使用されるクラスレベルのメタデータを定義します。具体的には、@ ContextConfigurationは、アプリケーションコンテキストリソースの場所またはコンテキストのロードに使用される注釈付きクラスのいずれかを宣言します。助けたい

助けたい

1
Federico Piazza