Unité-le test d'une classe qui appelle une méthode statique

Je suis en train de test unitaire d'une classe 'A' qui appelle une méthode statique d'une classe "B". Classe " B " est essentiellement un google goyave cache qui récupère une valeur(Objet) à partir du cache de donner une clé, ou des charges de l'objet dans le cache (dans le cas d'un cache-miss) à l'aide d'un adaptateur de service. Le service de l'adaptateur de classe a d'autres autocâblés dépendances pour récupérer l'objet.

Ce sont les classes à des fins d'illustration:

Classe Un

public class A {
    public Object getCachedObject(String key) {
        return B.getObjectFromCache(key);
    }
}

Classe 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)
        }
    }
}

Service De L'Adaptateur Classe

public class ServiceAdapter {
        @Autowired
        private MainService mainService

        public Object getFromService(String key) {
            return mainService.getTheObject(key);
        }
    }

Je suis capable de faire le test d'intégration avec succès et fetch (ou de charge) la valeur de (ou dans) le cache. Cependant, je suis incapable d'écrire les tests unitaires pour la classe A. C'est ce que j'ai essayé:

Unité de Test pour la Classe 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);
    }
}

Quand je lance le test unitaire, il échoue avec une NullPointerException à ServiceAdapter classe où l'appel: mainService.getTheObject(key) est fabriqué.

Comment se moquer de la dépendance de ServiceAdapter alors que les tests unitaires de la classe A. je ne devrais pas être simplement préoccupés par la dépendance immédiate que la classe A a, viz. B.

Je suis sûr que je suis en train de faire quelque chose de fondamentalement mauvais. Comment dois-je écrire les tests unitaires de la classe A?

Votre classe B n'a même pas compiler
Je voulais juste illustrer la façon dont les classes sont comme. J'ai une abstraction de beaucoup juste pour des fins d'illustration, et ce n'est pas la véritable cours en tant que tels.
En règle générale, si vous avez de se moquer d'un appel à une méthode statique, cela signifie que votre code n'est pas correctement écrit et doit être réécrit pour être testable, il est donc important que vous donnez quelque chose de travailler si vous voulez savoir comment vous devez réécrire votre code
Injecter de la classe de cache comme une dépendance au lieu de le rendre statique.

OriginalL'auteur user1639485 | 2016-10-07