ホームページ  >  記事  >  Java  >  Javaでvoid型を単体テストする方法を詳しく解説

Javaでvoid型を単体テストする方法を詳しく解説

高洛峰
高洛峰オリジナル
2017-01-19 14:32:431505ブラウズ

まえがき

私たちが Java を学んでいたとき、教師や一般の本には、Java には 8 つの基本的なタイプがあると書かれていました。それらは、byte、int、short、long、float、double、char、boolean です。しかし、今朝 Java のバイブル「Java で考える」を読んでいると、著者がデータ型を説明するときに void を入れていることに気づきました。ということで9種類あります。 Baidu で検索すると、Java には 9 つの基本型があると書かれている本もありました。

Java のサービス層には、save* や update* などの void 型のメソッドが多数ありますが、これらのメソッドは一部の更新を行うだけで、メソッドの戻り値に基づいて単一のテストを作成することはできません。特別なメソッドのみを使用できます。

このメソッド環境: Mockito、testng

テストされたメソッド:

テストする VOID メソッド Java

@Override
 public void updateRuleName(Long ruleId, String newRuleName, Long ucId) {
 Assert.notNull(ruleId, "规则ID不能为Null");
 Assert.notNull(newRuleName, "规则名称不能为Null");
 Assert.notNull(ucId, "操作人的UCID不能为Null");
  
 String cleanNewRuleName = StringUtils.trim(newRuleName);
 if (StringUtils.isBlank(cleanNewRuleName)) {
  throw new IllegalArgumentException("新的规则名称不能为空");
 }
  
 // 查询规则对象
 Rule rule = queryRuleById(ruleId);
 if (null == rule) {
  throw new IllegalDataException("没有查到该规则");
 }
  
 rule.setRuleId(ruleId);
 rule.setRuleName(cleanNewRuleName);
 rule.setUpdateUcid(ucId);
 rule.setUpdateTime(new Date());
  
 ruleDao.updateSelective(rule);
 }

テストされたメソッド:

void が返されたメソッド test Java

@Test
public void testUpdateRuleName() {
Long ruleId = 1L;
String newRuleName = "newRuleName";
Long ucId = 123L;
 
List<Rule> rules = new ArrayList<Rule>();
Rule rule = new Rule();
rule.setRuleStatus((byte) DBValueSetting.RULE_STATUS_TAKE_EFFECT);
rules.add(rule);
 
// 查询规则对象
Map<String, Object> params = new HashMap<String, Object>();
params.put("ruleId", ruleId);
Mockito.when(ruleDao.queryRulesByCondition(params)).thenReturn(rules);
 
Mockito.doAnswer(new Answer<Object>() {
 public Object answer(InvocationOnMock invocation) {
 // 断点2:这里随后执行
 Rule rule = (Rule) invocation.getArguments()[0];
 Assert.assertTrue(rule.getRuleName().equals("newRuleName"));
 return null;
 }
}).when(ruleDao).updateSelective(Mockito.any(Rule.class));
 
// 断点1:先执行到这里
ruleService.updateRuleName(ruleId, newRuleName, ucId);
}

コメントは、2 つのブレークポイントを追加すると、実行プロセス中に、エンドポイント 1 の実行中に最後の呼び出し行が最初に実行され、エンドポイント 2 のスタブが実行されることを示しています。ブレークポイント 2 でパラメータを入力し、入力パラメータに対してアサート検証を実行すると、目的が達成されます。

new Anwer は、メソッド呼び出しのプロキシ実行入口を設定するために使用される 1 つのメソッドのみを持つインターフェイスです。

doAnswer は Java で実装されています

public interface Answer<T> {
 /**
 * @param invocation the invocation on the mock.
 *
 * @return the value to be returned
 *
 * @throws Throwable the throwable to be thrown
 */
 T answer(InvocationOnMock invocation) throws Throwable;
}

「ruleDao.updateSelective(rule);」のコードが実行されると、モックオブジェクトに対して呼び出されるインターセプターがトリガーされ、そのインターセプター内で動的プロキシが作成されます。動的プロキシの呼び出しは、新しい Answer で説明されているメソッドです

インターセプト メソッドとプロキシ メソッドを使用して、モック オブジェクト メソッドの入力パラメータと出力パラメータの設定と取得を実現し、VOID メソッド内の実行クラス呼び出しを実現します。確認できます;

概要

以上がこの記事の内容です。この記事の内容が皆さんの学習や仕事に少しでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。 。

Java で void 型を単一テストする方法の詳細な説明については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。