私はあざけるのが初めてなので、このシナリオで遊んでいます。MyClass.process()
を呼び出すメソッドがありますMyClass.getFactory()
。正常に回復するgetFactory()
ことを保証できるように、失敗するようにモックしたいと思います。process()
モックの後に呼び出すとgetFactory()
例外が正しくスローされるようですが、元のprocess()
メソッドを介して呼び出されると例外はスローされません。
public class MyClass {
public MyFactory getFactory() throws FactoryException {
return ...
}
public String process() {
try {
MyFactory factory = getFactory();
...
}
catch(FactoryException ex) {
...
}
}
}
テストクラス:
public class MyClassTest {
@Test
public void testGetFactoryFails() {
try {
MyClass mockMyClass = mock(MyClass.class);
when(mockMyClass.getFactory()).thenThrow(new FactoryException());
mockMyClass.process();
fail("FactoryException should have been thrown.");
}
catch(FactoryException ex) {
// all good
}
}
}
すべてのフィードバックに感謝します。より複雑な環境で単一のメソッドをモックすると、すぐに管理不能になることがわかります。getFactory() の内容は重要ではありません。これは概念コードであり、製品コードではありません。
私が試した1つの方法はうまくいきます:
public class MyClassTest {
class MyClassMock1 extends MyClass {
@Override
public MyFactory getFactory() throws FactoryException {
throw new FactoryException("Bad factory instance.");
}
}
@Test
public void testGetFactoryFails() {
try {
MyClassMock1 mockMyClass = new MyClassMock1();
mockMyClass.process();
fail("FactoryException should have been thrown.");
}
catch(FactoryException ex) {
assertEquals("Bad factory instance.", ex.getMessage());
}
}
}