2015-10-20 3 views

ответ

2

Да, если вы также используете Powermock тестовый код может перехватить вызовы new и возвращают издеваться вместо этого. Таким образом, вы можете вернуть макет для new SecurityInterface(), а затем дразнить его поглотитель

Powermock совместим с EasyMock

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyClass.class) 
public class TestMyClass { 

@Test 
public void foo() throws Exception { 
    SecurityInterface mock = createMock(SecurityInterface.class); 

    //intercepts call to new SecurityInterface and returns a mock instead 
    expectNew(SecurityInterface.class).andReturn(mock); 
    ... 
    replay(mock, SecurityInterface.class); 
    ... 
    verify(mock, SecurityInterface.class); 
} 

} 
+0

Хм .. Не думал о власти. Хорошее предложение! – GregD

1

Нет - это именно тот вид статической связи, что вам необходимо разработать из ваших классов, чтобы сделать их можно проверить.

Вам необходимо предоставить SecurityInterface через поставщика или завод, который вы вводите: вы можете ввести экземпляр, который вызывает new в вашем производственном коде, и экземпляр, который возвращает макет в ваш тестовый код.

class MyClass { 
    void doSomething(SecurityInterfaceSupplier supplier) { 
    Object port = supplier.get().getSecurityPortType(); 
    } 
} 

interface SecurityInterfaceSupplier { 
    SecurityInterface get(); 
} 

class ProductionSecurityInterfaceSupplier implements SecurityInterfaceSupplier { 
    @Override public SecurityInterface get() { return new SecurityInterface(); } 
} 

class TestingSecurityInterfaceSupplier implements SecurityInterfaceSupplier { 
    @Override public SecurityInterface get() { return mockSecurityInterface; } 
} 
+0

Проблема в том, что я не могу работать в контексте КДИ/EJB и я могу» что-нибудь. В противном случае я мог бы сделать это действительно. Забыл упомянуть об этом .. – GregD

Смежные вопросы