クラス「B」の静的メソッドを呼び出すクラス「A」を単体テストしようとしています。クラス「B」には、基本的に、キーを指定してキャッシュから値(オブジェクト)を取得するか、サービスアダプターを使用してオブジェクトをキャッシュにロードする(キャッシュミスの場合)Googleグアバキャッシュがあります。service-adapter クラスには、オブジェクトを取得するための他の自動配線された依存関係があります。
これらは説明目的のためのクラスです:
クラスA
public class A {
public Object getCachedObject(String key) {
return B.getObjectFromCache(key);
}
}
クラスB
public class B {
private ServiceAdapter serviceAdapter;
public void setServiceAdapter(ServiceAdapter serAdapt) {
serviceAdapter = serAdapt;
}
private static final LoadingCache<String, Object> CACHE = CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterWrite(30, TimeUnit.MINUTES)
.build(new MyCacheLoader());
public static Object getObjectFromCache(final String key) throws ExecutionException {
return CACHE.get(warehouseId);
}
private static class MyCacheLoader extends CacheLoader<String, Object> {
@Override
public Object load(final String key) throws Exception {
return serviceAdapter.getFromService(key)
}
}
}
サービス アダプタ クラス
public class ServiceAdapter {
@Autowired
private MainService mainService
public Object getFromService(String key) {
return mainService.getTheObject(key);
}
}
統合テストを正常に実行し、キャッシュから (またはキャッシュに) 値をフェッチ (またはロード) することができます。ただし、クラス A の単体テストを作成できません。これは私が試したものです。
クラス A の単体テスト
@RunWith(EasyMocker.class)
public class ATest {
private final static String key = "abc";
@TestSubject
private A classUnderTest = new A();
@Test
public void getCachedObject_Success() throws Exception {
B.setServiceAdapter(new ServiceAdapter());
Object expectedResponse = createExpectedResponse(); //some private method
expect(B.getObjectFromCache(key)).andReturn(expectedResponse).once();
Object actualResponse = classUnderTest.getCachedObject(key);
assertEquals(expectedResponse, actualResponse);
}
}
単体テストを実行すると、mainService.getTheObject(key) の呼び出しが行われる ServiceAdapter クラスで NullPointerException が発生して失敗します。
クラス A の単体テスト中に ServiceAdapter の依存関係をモックするにはどうすればよいですか。B.
私は根本的に間違ったことをしていると確信しています。クラス A の単体テストはどのように記述すればよいですか?