I am trying to create the skeletton of a future app, using : java 8,windows 10, intelliJ, junit5, mockito. I get a problem while running a test using mockito, it's the first test I write using spies, and it doesn't work.
It seems that the statement when(client_spy.try_to_connect(anyString(),anyInt())).thenReturn(null);
leads to the execution of the method, which is not expected : I only want to tell to mockito to return null is the method try_to_connect
is called. Thus, the method is called in the test, and without parameters, so I get an error in this method.
here is the test class (some parts):
@ExtendWith(MockitoExtension.class)
public class unitTestsTry2 {
private static final String LOCAL_IP = "localhost";
private static final String REMOTE_IP = "localhost";
private static final String LOCAL_PORT = "1001";
private static final String REMOTE_PORT = "1002";
private static ApplicationRunner apr=new ApplicationRunner();
@Spy
ClientExtremity client_spy=new ClientExtremity();
(...)
@Test
void startupAndTryToConnect() {
apr.client_endpoint = client_spy;
when(client_spy.try_to_connect(anyString(),anyInt()))
.thenReturn(null); <--- THE FAULTLY LINE
apr.main(new String[]{LOCAL_IP,LOCAL_PORT,REMOTE_IP,REMOTE_PORT});
verify(((ClientOrders)apr.client_endpoint)).try_to_connect(REMOTE_IP,Integer.parseInt(REMOTE_PORT));
}
}
here is my gradle file:
buildscript {
dependencies {
classpath group: 'de.dynamicfiles.projects.gradle.plugins', name: 'javafx-gradle-plugin', version: '8.8.2'
}
repositories {
mavenLocal()
mavenCentral()
}
}
plugins {
id 'java'
}
group 'lorry'
version '1'
sourceCompatibility = 1.8
repositories {
mavenLocal()
mavenCentral()
maven { url "https://dl.bintray.com/mockito/maven" }
}
apply plugin: 'javafx-gradle-plugin'
test {
useJUnitPlatform()
}
compileJava.dependsOn clean
jfx {
// minimal requirement for jfxJar-task
mainClass = 'lorry.ApplicationRunner'
// minimal requirement for jfxNative-task
vendor = 'YourName'
launcherArguments = ["localhost", "1001", "localhost", "1002"]
// gradle jfxRun
runJavaParameter = null // String
//runAppParameter = "localhost" "1001" "localhost" "1002" // String
jfxMainAppJarName = "chat.jar"
}
dependencies {
//testCompile group: 'junit', name: 'junit', version: '4.12'
compile group: 'javax.websocket', name: 'javax.websocket-api', version: '1.1'
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
//testImplementation('org.junit.jupiter:junit-jupiter-api:5.2.0')
//testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.2.0')
def final junitVersion = "5.2.0"
compile group: 'com.google.inject', name: 'guice', version: '4.1.0'
//compile group: 'com.google.code.gson', name: 'gson', version: '2.8.2'
compile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: junitVersion
compile group: 'org.assertj', name: 'assertj-core', version: '3.9.0'
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.7'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-params', version: junitVersion
testCompile group: 'org.mockito', name: 'mockito-core', version: '2.21.0'
testCompile 'org.mockito:mockito-junit-jupiter:2.21.0'
testCompile group:'org.junit.jupiter',name:'junit-jupiter-api',version: junitVersion
testRuntime group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: junitVersion
compile 'org.hamcrest:hamcrest-all:1.3'
testCompile "org.testfx:testfx-core:4.0.13-alpha"
testCompile 'org.testfx:testfx-junit5:4.0.13-alpha'
compile group: 'org.glassfish.tyrus', name: 'tyrus-server', version: '1.13.1'
// https://mvnrepository.com/artifact/org.glassfish.tyrus/tyrus-client
compile group: 'org.glassfish.tyrus', name: 'tyrus-client', version: '1.13.1'
}
jar {
baseName = 'Chat'
version = ''
manifest {
attributes(
'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
'Main-Class': 'lorry.Chat'
)
}
}
EDIT thank you for your answers. I changed my code:
@Spy
public ClientExtremity client_spy=new ClientExtremity();
@Test
void startupAndTryToConnect() {
apr.client_endpoint = client_spy;
when(client_spy).try_to_connect(anyString(),anyInt()).thenReturn(null);
apr.main(new String[]{LOCAL_IP,LOCAL_PORT,REMOTE_IP,REMOTE_PORT});
verify(((ClientOrders)apr.client_endpoint)).try_to_connect(REMOTE_IP,Integer.parseInt(REMOTE_PORT));
}
but intelliJ tells to me : Error:(73, 25) java: cannot find symbol symbol: method try_to_connect(java.lang.String,int) location: interface org.mockito.stubbing.OngoingStubbing
having the following clientExtremity:
@ClientEndpoint(encoders = MessageEncoder.class, decoders = MessageDecoder.class)
public class ClientExtremity implements ClientOrders {
@OnMessage
public void onMessage(Message message) {
}
@Override
public Session try_to_connect(String remote_ip, Integer remote_port) {
ClientManager client = ClientManager.createClient();
Session session;
try {
session = client.connectToServer(ClientExtremity.class, new URI(
format("wss://%1$2s:%2$2d/chat",remote_ip,remote_port)
));
} catch (Exception e) {
e.printStackTrace();
session=null;
}
return session;
}
}
I can't figure out why the declaration of try_to_connect in the test method fails.
EDIT 2 here is applicationRunner:
public class ApplicationRunner {
public static String localIP, remoteIP;
public static int localPort, remotePort;
public static Fenetre fenetre = new Fenetre();
public static Session session=null;
public static ClientExtremity client_endpoint=new ClientExtremity();
public static void init(String[] args) {
localIP = args[0];
localPort = Integer.parseInt(args[1]);
remoteIP = args[2];
remotePort = Integer.parseInt(args[3]);
try {
new Thread(fenetre).start();
} catch (Exception e) {
e.printStackTrace();
}
session = ((ClientOrders) client_endpoint).try_to_connect(localIP,localPort);
}
public static void main (String[]args){
init(args);
}
}
ok, done. a correct code is:
@Test
void startupAndTryToConnect() {
ClientExtremity client_spy = spy(new ClientExtremity());
apr.client_endpoint = client_spy;
doReturn(null).when(client_spy).try_to_connect(anyString(), anyInt());
apr.init(new String[]{LOCAL_IP,LOCAL_PORT,REMOTE_IP,REMOTE_PORT});
verify(client_spy).try_to_connect(REMOTE_IP,Integer.parseInt(REMOTE_PORT));
}
I needed to:
verify(someObjectInstance,optionalAdditionalParameters).someMethod(someArgsWithMatchers)
@ExtendWith(MockitoExtension.class)
, I had to put MockitoAnnotations.initMocks(unitTestsTry2.class);
in a @BeforeAll annotated method.
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.