テスト方法種類
assertEquals(期待値結果、結果);
期待値結果と結果が同じとき、trueとなる
assertNotEquals(期待値結果, 結果)
期待値結果と結果が違うとき、trueとなる。
assertNotNull(A)
Aがnullでないとき、trueになる
assertNull(A)
Aがnullのとき、trueになる
assertTrue(A)
Aがtrueであるとき、trueが返される。そのため、Aに入るのはboolean型になる。
assertFalse(A)
Aがfalseであるとき、trueが返される。
assertIterableEquals(A, B)
List等であるAやBのすべての要素が順番通りに等しいとき、trueが返される
テスト対象クラス
public class GetUser{
private UserDAO dao;
public GetUserc() {
super();
dao = new UserDAO();
}
public List<User> execute(){
List<User> userList = dao.findAll();
return userList;
}
テストクラス
public class GetUser_Test {
@InjectMocks
private GetUser getUser;
@Mock
private UserDAO dao;
@BeforeEach
void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void executeTest01() {
List <User>userList = new ArrayList();
User user = new User (1, "Alice", "Hi");
userList.add(user);
when(dao.findAll()).thenReturn(userList);
assertIterableEquals(userList, getUser.execute());
}
Mockを利用することで、擬似的な環境を構築することができるようになる。Mockの対象はテスト対象クラスではなく、テスト対象クラスにimportされているクラスである。
@ParameterizedTest @ValueSource(型名s = {A,B,C})
switch文を検証する際に利用する
default文にも対応可
@ParameterizedTest
@ValueSource(ints = { 1, 2, 5 })
void test_doPost01(int result) {
switch (result) {
case 1:
assertTrue(istest_doPost01(result));
break;
case 2:
assertTrue(istest_doPost01(result));
break;
default:
assertTrue(istest_doPost01(result));
}
}
Method
privateメソッドを実行し、テスト
テスト対象クラス
public class Password {
//引数なし、戻り値なしのメソッド
private void print(){
System.out.println("new pass");
}
}
テストクラス
Password obj = new Password();
//メソッドを取得。
Method method = Product.class.getDeclaredMethod("print");
//メソッドにアクセスできるようにする。
method.setAccessible(true);
//メソッド実行
method.invoke(obj);
setField
privateフィールドをテストする
テスト対象クラス
public List<User> findAll() {
List<User> userList = new ArrayList<>();
//データベース接続
try(Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS)){
//SELECT文の準備
PreparedStatement pStmt = conn.prepareStatement(sql_select);
//SELECT文を実行
ResultSet rs = pStmt.executeQuery();
//SELECT文の結果をArrayListに格納
while(rs.next()) {
int id = rs.getInt("id");
String userName = rs.getString("name");
String text = rs.getString("text");
User user = new User(id, userName, text);
userList.add(User);
}
}catch(SQLException e) {
e.printStackTrace();
return null;
}
return userList;
}
テストクラス
@Test
public void findAll_test() throws Exception {
//setPrivateField(アクセスしたいオブジェクト, 変更したいフィールド名, 変更);
ReflectionUtil.setPrivateField(dao, "sql_select", "select id,name,text, location from \"user\" order by id desc");
assertEquals(null, dao.findAll());
}
参考資料
https://b1san-blog.com/post/java/java-junit/
https://www.zunouissiki.com/java-reflection-privatemethod-accessible/
https://tech.excite.co.jp/entry/2021/04/18/205538