I'm trying to write a unit test for a class which extends an abstract class but the tests are still trying to call the real abstract methods. Is there a way to inject an Mocked abstract class and verify that the abstracted method was called?
Test
public class TestThisClassTest {
@Tested
TestThisClass testThisClass;
@Injectable
String names;
@Injectable
String username;
@Injectable
char[] password = {'t', 'e', 's', 't', 's'};;
@Injectable
String destinationName;
@Injectable
AbstractClass abstractClass; // Thought this would inject but it's not
@Test(description = "Verify that sendMessageAbstractMethod is called")
public void testSendMessage(@Mocked ObjectMessage message) throws Exception {
testThisClass.sendMessage(message); // This is instantiating AbstractClass when it shouldn't be
new Verifications(){{
abstractClass.sendMessageAbstractMethod((Object) any);
times = 1;
}};
}
}
TestThisClass.class
public class TestThisClass extends AbstractClass {
public TestThisClass() {
super();
}
@Inject
public TestThisClass(String names, String username, char[] password, String destinationName) {
super(names, username, password, destinationName);
}
public void sendMessage(Object message) throws Exception { // Trying to test this method
sendMessageAbstractMethod(message); // This is "doing stuff." Need it verify this is called and move on
}
}
AbstractClass
public abstract class AbstractClass {
public AbstractClass(String names, String username, char[] password, String destinationName) {
this.names = names;
this.username = username;
this.password = password;
this.destinationName = destinationName;
}
protected void sendMessageAbstractMethod(Object message) throws Exception {
//do stuff
}
}
Solved this using a spy
public class TestThisClassTest {
@Injectable
String names;
@Injectable
String username;
@Injectable
char[] password = {'t', 'e', 's', 't', 's'};;
@Injectable
String destinationName;
@Test
public void testSendMessage(@Mocked ObjectMessage message) throws Exception {
TestThisClass abstractImpl = spy(new TestThisClass());
doNothing().when(abstractImpl).sendMessageAbstractMethod(any());
abstractImpl.sendMessage(message));
new Verifications(){{
verify(abstractImpl, times(1)).sendMessage(any());
}};
}
}
This should work:
public class TestThisClassTest {
@Tested
TestThisClass testThisClass;
@Injectable
String names;
@Injectable
String username;
@Injectable
char[] password = {'t', 'e', 's', 't', 's'};;
@Injectable
String destinationName;
@Test(description = "Verify that sendMessageAbstractMethod is called")
public void testSendMessage(@Mocked ObjectMessage message) throws Exception {
testThisClass.sendMessage(message);
new Verifications(testThisClass){{
testThisClass.sendMessageAbstractMethod((Object) any);
times = 1;
}};
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.