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