Ich brauche ein paar Ratschläge JMockit mit Kotlin verwenden.Mit Kotlin mit JMockit
(CUT) Dies ist mein (Java) Klasse im Test:
public final class NutritionalConsultant {
public static boolean isLunchTime() {
int hour = LocalDateTime.now().getHour();
return hour >= 12 && hour <= 14;
}
}
(J.1) Dies ist ein funktionierendes Java-Test-Klasse
@RunWith(JMockit.class)
public class NutritionalConsultantTest {
@Test
public void shouldReturnTrueFor12h(@Mocked final LocalDateTime dateTime) {
new Expectations() {{
LocalDateTime.now(); result = dateTime;
dateTime.getHour(); result = 12;
}};
boolean isLunchTime = NutritionalConsultant.isLunchTime();
assertThat(isLunchTime, is(true));
}
}
(kt.1) jedoch die entsprechende Klasse Kotlin löst eine Ausnahme
RunWith(javaClass<JMockit>())
public class NutritionalConsultantKt1Test {
Test
public fun shouldReturnTrueFor12h(Mocked dateTime : LocalDateTime) {
object : Expectations() {{
LocalDateTime.now(); result = dateTime;
dateTime.getHour(); result = 12;
}}
val isLunchTime = NutritionalConsultant.isLunchTime()
assertThat(isLunchTime, eq(true));
}
}
Ausnahme:
java.lang.Exception: Method shouldReturnTrueFor12h should have no parameters
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:41)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Die gleiche Ausnahme ausgelöst wird, wenn sie mit gradle laufen.
(kt.2) die @Mocked Syntax mit Kotlin Verwendung Ich bin eine andere Ausnahme bekommen:
RunWith(javaClass<JMockit>())
public class NutritionalConsultantKt2Test {
Mocked
var dateTime : LocalDateTime by Delegates.notNull()
Test
public fun shouldReturnTrueFor12h() {
object : Expectations() {{
LocalDateTime.now(); result = dateTime;
dateTime.getHour(); result = 12;
}}
val isLunchTime = NutritionalConsultant.isLunchTime()
assertThat(isLunchTime, eq(true));
}
}
Ausnahme:
java.lang.IllegalArgumentException: Final mock field "dateTime$delegate" must be of a class type
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
bearbeiten 20.150.224 vielleicht Zusammenhang damit auf „Für Ein Mock-Feld, eine Instanz des deklarierten Typs wird automatisch von JMockit erstellt und dem Feld zugewiesen, sofern es nicht endgültig ist. " (Von http://jmockit.org/tutorial/BehaviorBasedTesting.html)
(kt.3) jedoch das Val an var ändern und unter Verwendung !! Betreiber führen zu einem Arbeits Test ... aber das ist nicht idiomatischer Kotlin Code:
RunWith(javaClass<JMockit>())
public class NutritionalConsultantKt3Test {
Mocked
var dateTime : LocalDateTime? = null
Test
public fun shouldReturnTrueFor12h() {
object : Expectations() {{
LocalDateTime.now(); result = dateTime;
dateTime!!.getHour(); result = 12;
}}
val isLunchTime = NutritionalConsultant.isLunchTime()
assertThat(isLunchTime, eq(true));
}
}
Haben Sie mit JMockit mehr Erfolg mit Kotlin haben?
> Ich würde lieber bei Java bleiben (was sich weiter entwickelt - siehe Java 8) Ich möchte nur darauf hinweisen, dass dies unter Android nicht der Fall ist. –
@JaysonMinard Rogerio ist der Autor von jmockit – Novaterata