Tôi cần một số lời khuyên sử dụng jmockit với kotlin.Sử dụng kotlin với jmockit
(CUT) Đây là của tôi (Java) lớp dưới kiểm tra:
public final class NutritionalConsultant {
public static boolean isLunchTime() {
int hour = LocalDateTime.now().getHour();
return hour >= 12 && hour <= 14;
}
}
(j.1) Đây là một lớp thử nghiệm Java làm việc
@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) Tuy nhiên, lớp Kotlin tương ứng ném một ngoại lệ
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));
}
}
ngoại lệ:
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)
Cùng một ngoại lệ được ném khi chạy bằng gradle.
(kt.2) Sử dụng cú pháp @Mocked với Kotlin Tôi nhận được một ngoại lệ khác nhau:
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));
}
}
Ngoại lệ:
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)
chỉnh sửa 20.150.224 có lẽ đây có liên quan đến "Đối với một trường mô hình, một thể hiện của kiểu khai báo sẽ được tạo tự động bởi JMockit và được gán cho trường, miễn là nó không phải là cuối cùng. " (từ http://jmockit.org/tutorial/BehaviorBasedTesting.html)
(kt.3) Tuy nhiên, thay đổi val thành var và sử dụng !! nhà điều hành dẫn đến thử nghiệm hoạt động ... nhưng đây không phải là mã kotlin thành ngữ:
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));
}
}
Bạn có thành công hơn khi sử dụng kotlin với jmockit không?
> Tôi thà gắn bó với Java (tiếp tục phát triển - xem Java 8) Chỉ muốn lưu ý rằng điều này không đúng trên Android. –
@JaysonMinard Rogerio là tác giả của jmockit – Novaterata