কোটলিনে পরীক্ষা প্রত্যাশিত ব্যতিক্রম


91

জাভাতে, প্রোগ্রামার JUnit পরীক্ষার ক্ষেত্রে যেমন প্রত্যাশিত ব্যতিক্রমগুলি নির্দিষ্ট করতে পারে:

@Test(expected = ArithmeticException.class)
public void omg()
{
    int blackHole = 1 / 0;
}

আমি কীভাবে কোটলিনে এটি করব? আমি দুটি সিনট্যাক্স বৈকল্পিক চেষ্টা করেছি, কিন্তু তাদের কোনওটিই কাজ করে নি:

import org.junit.Test

// ...

@Test(expected = ArithmeticException) fun omg()
    Please specify constructor invocation;
    classifier 'ArithmeticException' does not have a companion object

@Test(expected = ArithmeticException.class) fun omg()
                            name expected ^
                                            ^ expected ')'

উত্তর:


126

JUnit 4.12 এর জাভা উদাহরণটির কোটলিন অনুবাদটি হ'ল:

@Test(expected = ArithmeticException::class)
fun omg() {
    val blackHole = 1 / 0
}

যাইহোক, JUnit 4.13 সূক্ষ্ম-দানাদার ব্যতিক্রম স্কোপের জন্য দুটি পদ্ধতি চালুassertThrows করেছে:

@Test
fun omg() {
    // ...
    assertThrows(ArithmeticException::class.java) {
        val blackHole = 1 / 0
    }
    // ...
}

উভয় assertThrowsপদ্ধতিই অতিরিক্ত দাবিগুলির জন্য প্রত্যাশিত ব্যতিক্রমটি ফিরিয়ে দেয়:

@Test
fun omg() {
    // ...
    val exception = assertThrows(ArithmeticException::class.java) {
        val blackHole = 1 / 0
    }
    assertEquals("/ by zero", exception.message)
    // ...
}

79

কোটলিনের নিজস্ব পরীক্ষা সহায়ক প্যাকেজ রয়েছে যা এই ধরণের ইউনিটেস্ট করতে সহায়তা করতে পারে।

আপনার পরীক্ষাটি ব্যবহারের মাধ্যমে খুব অভিব্যক্তিপূর্ণ হতে পারে assertFailWith:

@Test
fun test_arithmethic() {
    assertFailsWith<ArithmeticException> {
        omg()
    }
}

4
যদি আপনার লিঙ্কটিতে একটি 404 পান, তবে kotlin.testঅন্য কিছু দ্বারা প্রতিস্থাপন করা হয়েছে?
ফ্রেডওভারফ্লো

@ ফ্রেডওভারফ্লো নং, প্রতিস্থাপন করা হয়নি, তবে কেবল স্ট্যান্ডার্ড লাইব্রেরি থেকে সরানো হয়েছে। আমি গিথুব কোটলিন সংগ্রহস্থলের লিঙ্কটি আপডেট করেছি তবে দুর্ভাগ্যক্রমে ডকুমেন্টেশনের কোনও লিঙ্ক খুঁজে পাই না। যাইহোক জারটি কোটলিন-প্লাগইন দ্বারা ইন্টেলিজজে প্রেরণ করা হয় বা আপনি এটি নেটতে খুঁজে পেতে পারেন বা আপনার প্রকল্পে মাভেন / গ্র্যান্ডল নির্ভরতা যুক্ত করতে পারেন।
মিশেল ডি'আমিকো

7
সংকলন "org.jetbrains.kotlin: কোটলিন-পরীক্ষা: $ কোটলিন_বর্তন"
ম্যাক 229

4
@ ম্যাক 229 এস / সংকলন / পরীক্ষাকম্পাইল /
লরেন্স

@ আশিষশর্মা: কোটল্ল্যাং.আর্গ / অ্যাপি / স্লেট / কোটলিন.টেষ্ট / কোটলিন.টেষ্ট ।… অ্যাসেটফেইল ব্যতিক্রমটি ফিরিয়ে দেয় এবং আপনি এটি নিজের দাবিতে লিখতে ব্যবহার করতে পারেন।
মিশেল ডি'আমিকো

26

@Test(expected = ArithmeticException::class)কোটলিনের লাইব্রেরি পদ্ধতিগুলির মতো আপনি ব্যবহার করতে পারেন বা আরও উন্নত করতে পারেন failsWith()

আপনি এটির মতো সংশোধিত জেনেরিকগুলি এবং কোনও সহায়ক পদ্ধতি ব্যবহার করে এটি আরও খাটো করে তুলতে পারেন:

inline fun <reified T : Throwable> failsWithX(noinline block: () -> Any) {
    kotlin.test.failsWith(javaClass<T>(), block)
}

এবং টীকা ব্যবহার করে উদাহরণ:

@Test(expected = ArithmeticException::class)
fun omg() {

}

javaClass<T>()এখন অবচয় করা হয়েছে। MyException::class.javaপরিবর্তে ব্যবহার করুন।

ব্যর্থতা হ্রাস করা হয়, assertFails পরিবর্তে ব্যবহার করা উচিত।
gvlasov

15

আপনি এর জন্য কোটলিন টেস্ট ব্যবহার করতে পারেন ।

আপনার পরীক্ষায় আপনি সালিশ কোডটি একটি কাঁধের থ্রো ব্লক দিয়ে মোড়াতে পারেন:

shouldThrow<ArithmeticException> {
  // code in here that you expect to throw a ArithmeticException
}

লাইন মনে হচ্ছে এটি সঠিকভাবে কাজ করে না। আমি 1 টি পরীক্ষা করবো <জাভা.লাং। অ্যাসেসারেশন এরর> {কিছু মেঠোড () .একটি সত্য হওয়া উচিত - সবুজ 2. shouldw থ্রো <জাভা.আং.অ্যাসেসারেশন এরর> {কিছু মেঠোড () .একটি মিথ্যা} - সবুজ কিছু মেঠোড () নিক্ষেপ "জাভা .lang.AsertionError: ম্যাসেজ "যখন এটি করা উচিত, এবং ঠিক আছে তবে অবজেক্টটি ফিরিয়ে দিন। উভয় ক্ষেত্রেই উচিত যখন সবুজ হয় ঠিক আছে এবং কখন নয় NOT
ইভান ট্রেচিয়োকাস

হয়তো ডক্স কটাক্ষপাত করা, এটা 2016. আমার উত্তর থেকে পরিবর্তিত হতে পারে github.com/kotlintest/kotlintest/blob/master/doc/...
sksamuel

13

JUnit5 এর অন্তর্নির্মিত কোটলিন সমর্থন রয়েছে।

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows

class MyTests {
    @Test
    fun `division by zero -- should throw ArithmeticException`() {
        assertThrows<ArithmeticException> {  1 / 0 }
    }
}

4
এটি আমার পছন্দসই উত্তর। আপনি যদি Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6অ্যাসেটআউটস পেয়ে যান তবে আপনার বিল্ড.gradle রয়েছে তা নিশ্চিত করুনcompileTestKotlin { kotlinOptions.jvmTarget = "1.8" }
বিগ কুমড়ো

11

আপনি কোটলিন.স্টেস্ট প্যাকেজ সহ জেনেরিকগুলিও ব্যবহার করতে পারেন:

import kotlin.test.assertFailsWith 

@Test
fun testFunction() {
    assertFailsWith<MyException> {
         // The code that will throw MyException
    }
}

1

এক্সটেনশন যুক্ত করুন যা ব্যতিক্রম শ্রেণিটি যাচাই করে এবং ত্রুটির বার্তাটি মিলে যায় কিনা।

inline fun <reified T : Exception> assertThrows(runnable: () -> Any?, message: String?) {
try {
    runnable.invoke()
} catch (e: Throwable) {
    if (e is T) {
        message?.let {
            Assert.assertEquals(it, "${e.message}")
        }
        return
    }
    Assert.fail("expected ${T::class.qualifiedName} but caught " +
            "${e::class.qualifiedName} instead")
}
Assert.fail("expected ${T::class.qualifiedName}")

}

উদাহরণ স্বরূপ:

assertThrows<IllegalStateException>({
        throw IllegalStateException("fake error message")
    }, "fake error message")

1

কেউ উল্লেখ করেনি যে assertFailsWith () মানটি দেয় এবং আপনি ব্যতিক্রম বৈশিষ্ট্যগুলি পরীক্ষা করতে পারেন:

@Test
fun `my test`() {
        val exception = assertFailsWith<MyException> {method()}
        assertThat(exception.message, equalTo("oops!"))
    }
}

0

ক্লুয়েন্ট ব্যবহার করে সিনট্যাক্সিসের আরেকটি সংস্করণ :

@Test
fun `should throw ArithmeticException`() {
    invoking {
        val backHole = 1 / 0
    } `should throw` ArithmeticException::class
}

0

চমত্কার পদক্ষেপগুলি (expected = YourException::class)পরীক্ষার টীকায় যোগ করা

@Test(expected = YourException::class)

দ্বিতীয় পদক্ষেপটি এই ফাংশনটি যুক্ত করা

private fun throwException(): Boolean = throw YourException()

শেষ পর্যন্ত আপনার কাছে এরকম কিছু থাকবে:

@Test(expected = ArithmeticException::class)
fun `get query error from assets`() {
    //Given
    val error = "ArithmeticException"

    //When
    throwException()
    val result =  omg()

    //Then
    Assert.assertEquals(result, error)
}
private fun throwException(): Boolean = throw ArithmeticException()

0

org. junit.jupiter.api.Assertions.kt

/**
 * Example usage:
 * ```kotlin
 * val exception = assertThrows<IllegalArgumentException>("Should throw an Exception") {
 *     throw IllegalArgumentException("Talk to a duck")
 * }
 * assertEquals("Talk to a duck", exception.message)
 * ```
 * @see Assertions.assertThrows
 */
inline fun <reified T : Throwable> assertThrows(message: String, noinline executable: () -> Unit): T =
        assertThrows({ message }, executable)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.