মকিতো সহ উপহাস থেকে চেক করা ব্যতিক্রমগুলি নিক্ষেপ করুন


173

আমি চেষ্টা করছি যখন আমার কোনও উপহাসকৃত বস্তুগুলির মধ্যে একটি নির্দিষ্ট পদ্ধতি ডাকা হয় তখন একটি চেক করা ব্যাতিক্রম ছুঁড়ে ফেলা হয়। আমি নিম্নলিখিত চেষ্টা করছি।

@Test(expectedExceptions = SomeException.class)
public void throwCheckedException() {
    List<String> list = mock(List.class);
    when(list.get(0)).thenThrow(new SomeException());
    String test = list.get(0);
}

public class SomeException extends Exception {
}

তবে, এটি নিম্নলিখিত ত্রুটি উত্পাদন করে।

org.testng.TestException: 
Expected exception com.testing.MockitoCheckedExceptions$SomeException but got org.mockito.exceptions.base.MockitoException: 
Checked exception is invalid for this method!
Invalid: com.testing.MockitoCheckedExceptions$SomeException

মকিতো ডকুমেন্টেশনের দিকে তাকিয়ে , তারা কেবল ব্যবহার করে RuntimeException, মকিতো দিয়ে কোনও মক অবজেক্ট থেকে চেক করা ব্যতিক্রমগুলি ফেলে দেওয়া কি সম্ভব নয়?

উত্তর:


221

তালিকার জন্য জাভা এপিআই পরীক্ষা করুন । পদ্ধতিটি
কেবল প্রসারিত যা ছড়িয়ে get(int index)পড়ে তা ঘোষণা করা হয় । আপনি মকিতোকে একটি ব্যতিক্রম নিক্ষেপ করার জন্য বলার চেষ্টা করছেন যা সেই নির্দিষ্ট পদ্ধতি কল দ্বারা নিক্ষেপ করা বৈধ নয়IndexOutOfBoundExceptionRuntimeException
SomeException()

আরও স্পষ্ট করা। তালিকা ইন্টারফেস একটি চেক করা ব্যতিক্রম জন্য উপলব্ধ করা হয় না থেকে নিক্ষেপ করা পদ্ধতি এবং তাই Mockito ব্যর্থ হচ্ছে। আপনি যখন উপহাসের তালিকা তৈরি করবেন , মকিতো তার মক তৈরি করার জন্য তালিকা। ক্লাসের সংজ্ঞাটি ব্যবহার করবে ।
get(int index)

আপনি যে আচরণটি নির্দিষ্ট করে when(list.get(0)).thenThrow(new SomeException()) দিচ্ছেন তা তালিকার API এ পদ্ধতি স্বাক্ষরের সাথে মেলে না , কারণ get(int index)পদ্ধতিটিSomeException() মকিতোকে ব্যর্থ করে না

আপনি যদি সত্যিই এটি করতে চান, তবে মকিতো একটি new RuntimeException()বা আরও ভাল একটি নিক্ষেপ করুন, new ArrayIndexOutOfBoundsException()যেহেতু এপিআই নির্দিষ্ট করে যে এটিই ছুঁড়ে ফেলার একমাত্র বৈধ ব্যতিক্রম।


যদিও আমার আসল কোডটি আসলে তালিকাটি ব্যবহার করছে না, আপনার উত্তরটি সেই পদ্ধতি কলের জন্যও প্রযোজ্য। আমি ভুল পদ্ধতি উপহাস করছি। ধন্যবাদ.
আর্থার মাল্টসন

2
অতিরিক্ত: মক্টোটিও কোনও অভিযোগ ছাড়াই কোনও অভিযোগ ছাড়াই কোনও পদ্ধতি ফেললে অভিযোগ করবে না, তবে আপনিও এই ব্যতিক্রমটি পাবেন
dwana

8
কোটলিনারদের জন্য: কোটলিন ব্যতিক্রমগুলি পরীক্ষা করে না, সুতরাং আপনি সাধারণত (ফাংশন স্বাক্ষরে) ঘোষণা করতে পারবেন না যে ফাংশনটি একটি ব্যতিক্রম ছুঁড়ে ফেলে। যাইহোক, আপনি Throwsসংকলক সমতুল্য জাভা কোডে নিক্ষেপকারী ঘোড়া হিসাবে একই বাইকোড জেনারেট করতে টীকাটি দিয়ে ফাংশনটি টীকায়িত করতে পারেন । আরও তথ্যের জন্য [এখানে] ( কোটলিংলং.আর.পি.আই / স্ট্লেস্ট / জেভিএম / স্টাডলিব / কোটলিন.জভিএম / থ্রো /… ) দেখুন।
জাভাদ সাদেকজাদেহ

1
এই চেকটি মকিতো 2.11.0 প্রকাশের পরে কার্যকর হয়েছে (দেখুন 2.10.3)
জেজেডি

106

একটি কার্যনির্বাহী একটি willAnswer()পদ্ধতি ব্যবহার করা হয় ।

উদাহরণস্বরূপ নিম্নোক্ত কাজগুলি (এবং এটি একটি নিক্ষেপ করে না MockitoExceptionতবে Exceptionএখানে প্রয়োজনীয় হিসাবে একটি চেক নিক্ষেপ করে) ব্যবহার করে BDDMockito:

given(someObj.someMethod(stringArg1)).willAnswer( invocation -> { throw new Exception("abc msg"); });

প্লেইন মকিতোর সমতুল্য doAnswerপদ্ধতিটি ব্যবহার করতে হবে


9
অথবা willAnswer( invocation -> { throw new Exception("abc msg"); }).given(someObj).someMethod(stringArg1);পদ্ধতিটি ফিরে আসার সময় ব্যবহার করুন void
জুলিয়েন ক্রোনেগ

9
বা যখন (someObj.someMethod (স্ট্রিংআরজি 1)) ব্যবহার করুন। তারপরে উত্তর (অনুরোধ -> {নিক্ষেপ নতুন এক্সেপশন ("abc msg");});
দিমিত্রি আলগাজিন

দুর্দান্ত কাজ, ধন্যবাদ! কোটলিনাররা যারা (1) কোনও এক্সটেনশন ফাংশন হিসাবে নির্বিঘ্নে এটি ব্যবহার করতে চান এবং (2) willThrow()সাধারণত অনুমতি দেয় এমন বেশ কয়েকটি আরোগুলি পাস করতে সক্ষম হন , আমি একটি গিস্ট
ডেভিড ফেরানান্ড

2
বা doAnswerথেকেnhaarman.mockitokotlin2
hmac

6

লক্ষ্য করুন সাধারণভাবে Mockito নেই তাই যতদিন ব্যতিক্রম বার্তা স্বাক্ষরে ঘোষিত হয় পরীক্ষিত ব্যতিক্রম নিক্ষেপ অনুমতি দেয়। উদাহরণস্বরূপ, দেওয়া

class BarException extends Exception {
  // this is a checked exception
}

interface Foo {
  Bar frob() throws BarException
}

এটি লিখিত আইনী:

Foo foo = mock(Foo.class);
when(foo.frob()).thenThrow(BarException.class)

তবে, যদি আপনি পদ্ধতিতে স্বাক্ষর হিসাবে ঘোষণা না করে একটি চেক করা ব্যতিক্রম নিক্ষেপ করেন তবে, যেমন

class QuxException extends Exception {
  // a different checked exception
}

Foo foo = mock(Foo.class);
when(foo.frob()).thenThrow(QuxException.class)

কিছুটা বিভ্রান্তিমূলক, জেনেরিক বার্তা দিয়ে রানটাইমে মকিতো ব্যর্থ হবে:

Checked exception is invalid for this method!
Invalid: QuxException

এটি আপনাকে বিশ্বাস করতে পারে যে সাধারণভাবে চেক করা ব্যতিক্রমগুলি অসমর্থিত তবে বাস্তবে মকিতো আপনাকে কেবল এটিই বলার চেষ্টা করছেন যে এই চেক করা ব্যতিক্রমটি এই পদ্ধতির জন্য বৈধ নয় ।


5

কোটলিনের সাথে সমাধান রয়েছে:

given(myObject.myCall()).willAnswer {
    throw IOException("Ooops")
}

প্রদত্ত কোথা থেকে আসে

org.mockito.BDDMockito.given আমদানি করুন


1

কোটলিনে এটি আমার পক্ষে কাজ করে:

when(list.get(0)).thenThrow(new ArrayIndexOutOfBoundsException());

দ্রষ্টব্য: ব্যতিক্রম ব্যতীত অন্য কোনও সংজ্ঞায়িত ব্যতিক্রম ছোঁড়া ()


আমি যা খুঁজছিলাম, অন্য যে কোনও ব্যতিক্রম ছুঁড়ে ফেলতে পারেException
e
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.