Si vous ne voulez pas utiliser DI ou Factories. Vous pouvez remanier votre classe d'une manière un peu plus délicate :
public class Foo {
private Bar bar;
public void foo(Bar bar){
this.bar = (bar != null) ? bar : new Bar();
bar.someMethod();
this.bar = null; // for simulating local scope
}
}
Et votre classe de test :
@RunWith(MockitoJUnitRunner.class)
public class FooTest {
@Mock Bar barMock;
Foo foo;
@Test
public void testFoo() {
foo = new Foo();
foo.foo(barMock);
verify(barMock, times(1)).someMethod();
}
}
Alors la classe qui appelle votre méthode foo le fera comme ceci :
public class thirdClass {
public void someOtherMethod() {
Foo myFoo = new Foo();
myFoo.foo(null);
}
}
Comme vous pouvez le constater, en appelant la méthode de cette manière, vous n'avez pas besoin d'importer la classe Bar dans une autre classe qui appelle votre méthode foo, ce qui est peut-être ce que vous voulez.
Bien sûr, l'inconvénient est que vous permettez à l'appelant de définir l'objet Bar.
J'espère que cela vous aidera.
2 votes
stackoverflow.com/questions/6520242/ - Mais je ne veux pas utiliser PowerMock.
0 votes
Changez l'API ou PowerMock. L'un ou l'autre.
0 votes
Comment couvrir quelque chose comme ceci ? public synchronized void start(BundleContext bundleContext) throws Exception { BundleContext bc = bundleContext ; logger.info("STARTING HTTP SERVICE BUNDLE") ; this. tracker = new ServiceTracker(bc, HttpService.class.getName(), null) { @Override public Object addingService(ServiceReference serviceRef) { httpService = (HttpService) super.addingService(serviceRef) ; registerServlets() ; return httpService ; }}}