के साथ कोटलिन का उपयोग करना मुझे कोटलिन के साथ jmockit का उपयोग करके कुछ सलाह चाहिए।jmockit
(कट) इस परीक्षा के तहत मेरे (जावा) वर्ग है:
public final class NutritionalConsultant {
public static boolean isLunchTime() {
int hour = LocalDateTime.now().getHour();
return hour >= 12 && hour <= 14;
}
}
(j.1) यह एक काम कर जावा परीक्षण वर्ग है
@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) हालांकि, इसी kotlin वर्ग एक अपवाद फेंकता
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));
}
}
अपवाद:
+०१२३५१६४१०६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)
ग्रेडल के साथ चलाने पर एक ही अपवाद फेंक दिया जाता है।
(kt.2) kotlin मैं एक अलग अपवाद हो रही है साथ @Mocked वाक्य रचना का उपयोग करना:
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));
}
}
अपवाद:
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)
संपादित 20,150,224 शायद इस से संबंधित है "के लिए एक नकली क्षेत्र, घोषित प्रकार का एक उदाहरण स्वचालित रूप से जेमॉकिट द्वारा बनाया जाएगा और क्षेत्र को सौंपा जाएगा, बशर्ते यह अंतिम नहीं है। " (http://jmockit.org/tutorial/BehaviorBasedTesting.html से)
(kt.3) हालांकि, वैल को var में बदलकर और !! ऑपरेटर एक काम कर परीक्षण की ओर जाता है ... लेकिन इस मुहावरेदार kotlin कोड नहीं है:
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));
}
}
आप और अधिक सफलता JMockit साथ kotlin का उपयोग कर किया है?
> मैं जावा के साथ चिपकना चाहता हूं (जो विकसित होता जा रहा है - जावा 8 देखें) बस यह ध्यान रखना चाहते हैं कि यह एंड्रॉइड पर सच नहीं है। –
@ जेसन मॉनार्ड रोजरियो jmockit – Novaterata