そこで、Java Spring プロジェクトのテストを書き始めました。
私が使用するのは JUnit と Mockito です。when()...thenReturn() オプションを使用すると、サービスをシミュレートせずにモックできると言われています。そこで、次のように設定します。
when(classIwantToTest.object.get().methodWhichReturnsAList(input))thenReturn(ListcreatedInsideTheTestClass)
しかし、どの when 節を実行しても、常に NullpointerException が発生します。これは、入力が null であるため当然のことです。
また、オブジェクトから別のメソッドをモックしようとすると、次のようになります。
when(object.method()).thenReturn(true)
メソッドには設定されていない変数が必要なので、ここでも Nullpointer が返されます。
しかし、この変数の作成などを回避するために、when()..thenReturn() を使用したいと思います。どのクラスがこのメソッドを呼び出しても、何があろうと、true または上記のリストが返されるようにしたいだけです。
これは基本的に私の側の誤解なのでしょうか、それとも他に何か問題があるのでしょうか?
コード:
public class classIWantToTest implements classIWantToTestFacade{
@Autowired
private SomeService myService;
@Override
public Optional<OutputData> getInformations(final InputData inputData) {
final Optional<OutputData> data = myService.getListWithData(inputData);
if (data.isPresent()) {
final List<ItemData> allData = data.get().getItemDatas();
//do something with the data and allData
return data;
}
return Optional.absent();
}
}
これが私のテストクラスです:
public class Test {
private InputData inputdata;
private ClassUnderTest classUnderTest;
final List<ItemData> allData = new ArrayList<ItemData>();
@Mock
private DeliveryItemData item1;
@Mock
private DeliveryItemData item2;
@Mock
private SomeService myService;
@Before
public void setUp() throws Exception {
classUnderTest = new ClassUnderTest();
myService = mock(myService.class);
classUnderTest.setService(myService);
item1 = mock(DeliveryItemData.class);
item2 = mock(DeliveryItemData.class);
}
@Test
public void test_sort() {
createData();
when(myService.getListWithData(inputdata).get().getItemDatas());
when(item1.hasSomething()).thenReturn(true);
when(item2.hasSomething()).thenReturn(false);
}
public void createData() {
item1.setSomeValue("val");
item2.setSomeOtherValue("test");
item2.setSomeValue("val");
item2.setSomeOtherValue("value");
allData.add(item1);
allData.add(item2);
}
ベストアンサー1
any()
この問題が発生しましたが、問題は ではなく でメソッドを呼び出していたことですanyInt()
。そのため、次のようになりました。
doAnswer(...).with(myMockObject).thisFuncTakesAnInt(any())
それを次のように変更する必要がありました:
doAnswer(...).with(myMockObject).thisFuncTakesAnInt(anyInt())
なぜ NullPointerException が発生したのかはわかりません。これが次の哀れな人の助けになるかもしれません。