Mockitoテストフレームワーク(一)
Mockとは
mockテストとは、テスト中に構築しにくいオブジェクトや入手しにくいオブジェクトに対して、テストのためのテスト方法を仮想オブジェクトで作成することです.
Mockの2つの重要な概念
Stub
stubは本当にオブジェクトのシミュレーションです.たとえば、呼び出し者が値を必要とする場合は、stubに値を出力させます.呼び出し者がstubに値を渡す必要がある場合は、stubでメソッドを定義してパラメータを受け入れます.しかし、これはmockのオブジェクトと本質的な違いがあります.stubはシミュレーションと言っても、本質的にはオブジェクトに対する簡単な実装であり、それがどんなに簡単であっても実装であり、それは本当に存在し、私たちが定義した操作コードが含まれています.@Controller
public class StubController {
@Autowired
StubService stubService;
@PostMapping()
public void Add(@RequestBody User user){
//when, finduser
User finduser =stubService.find(user);
}
}
@Service
public class StubServiceImpl implements StubService {
//@Autowired
//StubDao stubDao;
@Override
public User find(User user) {
User finduser = new User();
finduser.setId=user.getId();
finduser.setName=user.getName();
//User finduser = stubDao.select(user);
//Give,
return finduser ;
}
}
Mock
Mockオブジェクトは、テストで依存するオブジェクト間のインタラクションが予想されるかどうかを検証するために使用されます.mockのオブジェクトは、単純なコードが1つも存在しません.@Test
public void when_thenReturn(){
//mock Iterator
Iterator iterator = mock(Iterator.class);
// iterator next() hello, n world
when(iterator.next()).thenReturn("hello").thenReturn("world");
// mock
String result = iterator.next() + " " + iterator.next() + " " + iterator.next();
//
assertEquals("hello world world",result);
}
Mockテストツールはどれらがありますか?
現在Java言語をサポートしているMockテストツールには、EasyMock、JMock、Mockito、MockCreator、Mockrunner、MockMakerなどがあり、MockitoはJava向けのMockingフレームワークです.EasyMockやJMockとよく似ており、指定したインタフェースやクラスに対して簡単な方法でMockオブジェクトを生成するクラスライブラリであり、手動でのMockオブジェクトの作成を回避しています.しかし、Mockitoは、実行後に何が呼び出されたかを検証することで、所望の動作(Expectations)の必要性を解消します.Mockitoを使用すると、準備フェーズにわずかな時間を費やすだけで、簡潔なAPIを使用してきれいなテストを作成することができ、特定のクラスに対してMockオブジェクトを作成することができ、非Mockオブジェクトを「監視」する能力があります.
Mockito
mockitoの基本概念Mockテストはユニットテストの重要な方法の一つであり、Mockitoは流行のMockフレームワークとして、簡単で学びやすく、非常に簡潔なAPIがあり、テストコードの可読性が高い.Mockテストとは、テスト中に構築が容易でない(例えば、HttpServertRequestがServertコンテナで構築されなければならない)またはJDBCのResultSetオブジェクトなどの複雑なオブジェクトを取得する、または注目する必要がないオブジェクトに対して、仮想オブジェクト(Mockオブジェクト)を使用してテストを容易にするテスト方法を作成することです.Mockの最大の機能は、ユニットテストの結合を分解することです.コードに別のクラスやインタフェースに依存している場合は、これらの依存をシミュレートし、呼び出された依存の動作を検証することができます.Javaでは現在、主なMockテストツールとしてMockito、JMock、EasyMockなどがあり、多くのJava Mockライブラリ、例えばEasyMockやJMockはexpect-run-verify(期待-実行-テスト)の方式であり、Mockitoは実行後のインタラクションで質問するのが簡単である.Mockitoを使用して、実行前にstubを行い、その後、インタラクションで検証すればよいことを主に覚えておいてください.
MockitoのStubとMock
@Controller
public class StubController {
@Autowired
StubService stubService;
@PostMapping()
public void Add(@RequestBody User user){
//when, finduser
User finduser =stubService.find(user);
}
}
@Service
public class StubServiceImpl implements StubService {
//@Autowired
//StubDao stubDao;
@Override
public User find(User user) {
User finduser = new User();
finduser.setId=user.getId();
finduser.setName=user.getName();
//User finduser = stubDao.select(user);
//Give,
return finduser ;
}
}
@Test
public void when_thenReturn(){
//mock Iterator
Iterator iterator = mock(Iterator.class);
// iterator next() hello, n world
when(iterator.next()).thenReturn("hello").thenReturn("world");
// mock
String result = iterator.next() + " " + iterator.next() + " " + iterator.next();
//
assertEquals("hello world world",result);
}
Stub
Mock
Mockitoの具体的な使用
プロジェクトがMavenが管理している場合はpomにあります.xmlに依存を追加するには:
org.mockito
mockito-all
1.8.5
test
そしてプログラム内で直接import static org.mockito.Mockito.*; すぐ
まず例を見てみましょう.
@Test
public void argumentExpectTest(){
User userMock = mock(User.class);
Mockito.when(userMock.getName()).thenReturn("xiaoming");
System.out.println(userMock.getName());
//
Mockito.verify(userMock).getName();
assertEquals(" :xiaoming","xiaoming", userMock.getName());
//
Mockito.verify(userMock,times(2)).getName();
}
mockListはUserのオブジェクトをシミュレートし,Userのすべてのメソッドと属性を持つ.when(…).thenReturn(…)とは、このメソッドを実行すると、指定した値が返されることを意味します.シミュレーション構成オブジェクトのプロシージャに相当し、いくつかの条件に予想される戻り値を指定します.ここでのUserはUserオブジェクトであり、実装クラスではありません.実装クラスも使用できます.杭打ちオブジェクトとして使用できます.ここでの杭打ち(Stub)はスタブとも呼ばれ,必要なテストデータを対象に詰め込み,入力と出力に注目する.ここのwhen(...)thenReturn(…)は、オブジェクトメソッドとパラメータを定義し(入力)、thenReturn()で結果(出力)を指定します.このプロセスはStub杭打ちで、このメソッドがStubされると、このstubの値が返されます.
戻り値のないメソッドのテスト
@Test
public void argumentDoNothingTest(){
User userMock = mock(User.class);
doNothing().when(userMock).setName();
userMock.setName();
//
Mockito.verify(userMock).setName();
//
Mockito.verify(userMock,times(1)).setName();
}
異常を投げ出す
@Test
public void argumentDoThrowTest(){
User userMock = mock(User.class);
//
Mockito.when(userMock.getName()).thenThrow(new RuntimeException());
doThrow(new RuntimeException()).when(userMock).getName();
userMock.getName();
}
thenThrow()とdoThrow()の2つの方法で、どちらかを選択して使用すればよい.
パラメータマッチング
@Test
public void argumentMatchersTest(){
Map mapMock = mock(Map.class);
Mockito.when(mapMock.put(anyInt(), anyString())).thenReturn("world");
mapMock.put(1, "hello");
//Mockito.verify(mapMock).put(anyInt(), eq("hello"));
Mockito.verify(mapMock).put(anyInt(), eq(anyString()));
}
Mockito.verify(mapMock).put(anyInt(), eq(“hello”));報告します.mockito.exceptions.misusing.InvalidUseOfMatchersException:異常、eq(「hello」)にもパラメータマッチング器が必要な方法anyString()
Verifyの検証
前のwhen(...)thenReturn(...)はステータステストに属し、結果を返すのではなく、メソッドが正しいパラメータで呼び出されたかどうかに関心を持つ場合があります.この場合、検証メソッドを使用する必要があります.概念的には、ステータステストとは異なる「行動テスト」です.シミュレーションオブジェクトをmockで杭打ちすると、mockitoはこのシミュレーションオブジェクトがどのようなメソッドを呼び出したか、何回呼び出したかを記録し、最後にユーザーが検証する必要があるか、すなわちverify()メソッドを決定する.
userMock.setName("one");
userMock.setName("two");
// setName()
verify(userMock ).setName("one");
//
Mockito.verify(userMock).setName();
//
Mockito.verify(userMock,times(1)).setName();
Mockitoは、times(N)メソッドを呼び出してくれるほか、never()が呼び出されていないこと、times(0)atLeast(N)が少なくともN回呼び出されたことに相当するatLeastOnce()がatLeast(1)atMost(N)が最大でN回呼び出されたことに相当するverifyも、whenのようにシミュレーションパラメータを使用することができ、メソッドのいずれかのパラメータがmatcherを使用している場合、すべてのパラメータにmatcherを使用する必要があります.
Spy
Mockオブジェクトはstubbedメソッドを呼び出すことができ、実際のメソッドを呼び出すことはできませんが、Mockitoは実際のオブジェクトを監視することができます.この場合、メソッド呼び出しを行うと、実際のメソッドが呼び出され、stubbingというオブジェクトのメソッドが私たちの期待値を返すことができます.またverifyで検証することもできます.監視オブジェクトは、オブジェクトを監視するためにspy(T object)メソッドを呼び出す必要がある.例えば、List spy=spy(new LinkedList()ではspy変数はLinkedListインスタンスを監視しています.被監視オブジェクトのStubbing stubbing被監視オブジェクトのメソッドは、次のように注意してください.
List spy = spy(new LinkedList());
//Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
when(spy.get(0)).thenReturn("foo");
//You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);
when(spy.get(0))が呼び出される.thenReturn(「foo」)の場合、実際のオブジェクトのget(0)が呼び出され、listが空であるためIndexOutOfBoundsException異常が投げ出され、doReturnではget(0)メソッドが呼び出されないため、このような状況の発生を回避できます.
参考記事:[1]:https://www.cnblogs.com/lyy-2016/p/6155445.html