বিভিন্ন প্যারামের সাহায্যে একাধিক পদ্ধতি কল কীভাবে যাচাই করা যায়


116

আমার নিম্নলিখিত পদ্ধতি রয়েছে যা আমি আচরণটি যাচাই করতে চাই।

public void methodToTest(Exception e, ActionErrors errors) {
    ...

    errors.add("exception.message", 
            ActionMessageFactory.createErrorMessage(e.toString()));

    errors.add("exception.detail",
            ActionMessageFactory.createErrorMessage(e.getStackTrace()[0].toString()));

    ...
}

আমার @ টেস্ট ক্লাসে আমি errors.add()"ব্যতিক্রম.মেসেজ" এবং আবার "ব্যতিক্রম.ডেটাইল" দিয়ে ডাকে যাচাই করার জন্য এটির মতো কিছু করার আশা করছিলাম

verify(errors).add(eq("exception.message"), any(ActionError.class));
verify(errors).add(eq("exception.detail"), any(ActionError.class));

তবে মকিতো নীচে অভিযোগ করেছেন

Argument(s) are different! Wanted:
actionErrors.add(
    "exception.message",
    <any>
);

Actual invocation has different arguments:
actionErrors.add(
    "exception.detail",
    org.apache.struts.action.ActionError@38063806
);

আমি কীভাবে মকিতোকে উভয় মান পরীক্ষা করতে বলব?


1
যখন আপনার 2 টি ভিন্ন স্বাক্ষর সহ পদ্ধতি রয়েছে, আপনি উভয়ের জন্য পৃথক পরীক্ষার কেস লিখতে পারেন।
নবীন বাবু

8
হ্যাঁ, তবে এক্ষেত্রে এটি একই পদ্ধতির স্বাক্ষর কিন্তু ঠিক বিভিন্ন যুক্তির মান
ব্র্যাড

আপনি ব্যবহার করার চেষ্টা করতে পারেনMockito.reset()
টাকসসট

উত্তর:


102

আরও পড়া আমাকে আরগমেন্টক্যাপ্টর এবং নিম্নলিখিত রচনাগুলি ব্যবহার করার চেষ্টা করতে পরিচালিত করেছে, যদিও আমি চাই না তার চেয়ে অনেক বেশি ভার্বোস।

ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);

verify(errors, atLeastOnce()).add(argument.capture(), any(ActionMessage.class));

List<String> values = argument.getAllValues();

assertTrue(values.contains("exception.message"));
assertTrue(values.contains("exception.detail"));

এই পন্থাটি ব্যবহার করে নির্দিষ্ট পরামিতিগুলি যুক্ত করা হয়েছিল কিনা তা নিশ্চিত করার কোনও উপায় আছে? উদাহরণস্বরূপ বলুন ওপি-র পদ্ধতিতে দুটি যুক্তি ছিল এবং তারা একত্রিত হয়েছিল যাচাই করতে চেয়েছিল
প্রতিশ্রুতিবদ্ধ

1
ওপির পরীক্ষার কেসটি methodToTest()একবারে কল করে , সুতরাং এই উত্তরটি যাচাই করে যে দুটি কল এক সাথে করা হয়েছিল। List<String> valuesজোর দেওয়া হচ্ছে এমন ক্যাপচারে কেবল দুটি মান পরীক্ষা করা হবে এবং অন্য কোনওটিই থাকবে না। আপনি যোগ করতে পারে assertTrue(values.size == 2)। আপনি যদি এটি চান তবে আমি 3 একক হামক্রস্টের সাথে 3 টি এ্যাসেটর ট্রু স্টেটমেন্ট প্রতিস্থাপন করব ...assertThat(values, contains("exception.message", "exception.detail"));
ব্র্যাড

ওপির পরীক্ষার কেস পদ্ধতিতে টোস্টেস্ট () দুবার কল করে না?
প্রতিশ্রুতিবদ্ধ

দুঃখিত আমি পরিষ্কার ছিল না। আমি সেই দৃশ্যের কথা উল্লেখ করছিলাম যেখানে ওপি পরীক্ষা করতে চেয়েছিল যে দুটি যুক্তি একযোগে ডাকা হয়েছিল। সুতরাং পদ্ধতিটির স্বাক্ষরটিতে জনসাধারণের শূন্যপদ মেথডোস্টেস্টের মতো কিছু দেখাবে (ব্যতিক্রম ই, বার্তা মি, অ্যাকশনআররেস ত্রুটি) - যাতে একটি নির্দিষ্ট ব্যতিক্রম নির্দিষ্ট বার্তার সাথে ডাকে। আমি অনুমান করেছি যে আপনি কেবল দুটি আর্গুমেন্টক্যাপ্টর রাখতে পারেন এবং তারপরে সূচকটি পুনরুদ্ধার করতে পারেন এবং উভয় মান তালিকায় সেই সূচীতে মানগুলি ব্যবহার করে তুলনা করুন
প্রতিশ্রুতিবদ্ধ

ওপির পরীক্ষার কেস methodToTest()একবার কল করে । এটি হল পদ্ধতির যুক্তিটি ActionErrors errorsঅভ্যন্তরীণভাবে দু'বার বলা হয়।
ব্র্যাড

61

উভয় add()কলের ক্রম যদি প্রাসঙ্গিক হয় তবে আপনি ব্যবহার করতে পারেন InOrder:

InOrder inOrder = inOrder(errors);
inOrder.verify(errors).add(eq("exception.message"), any(ActionError.class));
inOrder.verify(errors).add(eq("exception.detail"), any(ActionError.class));

7
একক errorsযুক্তিটি পাস করার জন্য এটি যথেষ্ট : InOrder inOrder = inOrder(errors);( দস্তাবেজগুলি দেখুন )
গ্রিনহাউসভিগ

2
অর্ডার প্রাসঙ্গিক না হলে কী হবে? যা প্রায়শই ঘটে থাকে।
হেলিক্স

1
@ হেলিক্স সে ক্ষেত্রে ব্র্যাডের উত্তর ব্যবহার করুন। রূপান্তর Listকরার Setএবং দাবী করে যে, ইনপুট সেট যুক্তি যেমনটি কর্তৃক প্রদত্ত সেট সমান।
ফ্লপশট

25

এরকম কিছু চেষ্টা করুন:

verify(errors, times(2))
     .add(AdditionalMatchers.or(eq("exception.message"), eq("exception.detail")),
          any(ActionError.class));

4
আপনার চেক স্পষ্টতই খুব শিথিল।
হেলিক্স

17

আপনার কোডটিতে সম্ভবত সমস্যা আছে। কারণ বাস্তবে আপনি এই কোডটি লিখেছেন:

Map<Character, String> map = mock(Map.class);

map.put('a', "a");
map.put('b', "b");
map.put('c', "c");

verify(map).put(eq('c'), anyString());
verify(map).put(eq('a'), anyString());
verify(map).put(eq('b'), anyString());

নোট করুন যে প্রথম যাচাই করা সত্যিকারের অনুরোধগুলির ক্ষেত্রেও ক্রমযুক্ত নয়।

এছাড়াও, আমি আপনাকে পুনরায় জিজ্ঞাসা করব যে প্রকৃতপক্ষে আপনার নিজস্ব নয় এমন বিদ্রূপ করবেন না, যেমন স্ট্রट्स টাইপ।

[সম্পাদনা @ ব্র্যাড]

আমার আইডিইতে ব্রিসের কোড (উপরে) চালানোর পরে আমি দেখতে পাচ্ছি যে আমি অ্যাকশনমেসেজের পরিবর্তে অ্যাকশনএরর ব্যবহার করেছি, এজন্যই আমার যাচাইকরণ () মেলেনি। আমি প্রাথমিকভাবে পোস্ট করা ত্রুটি বার্তাটি ভেবে আমাকে বিভ্রান্ত করছে যে এটি প্রথম যুক্তি যা মিলছে না। দেখা যাচ্ছে এটি দ্বিতীয় যুক্তি ছিল।

সুতরাং আমার প্রশ্নের উত্তর হল

/** 
 * note that ActionMessageFactory.createErrorMessage() returns ActionMessage
 * and ActionError extends ActionMessage
 */
verify(errors).add(eq("exception.message"), any(ActionMessage.class));
verify(errors).add(eq("exception.detail"), any(ActionMessage.class));

1
আপনি যা বলতে চাইছেন তা পান না। আদেশ যাচাইয়ের বিষয়? যদি যাচাইয়ের আদেশের বিষয়টি বিবেচনা করে। তাহলে কেন এখানে অর্ডার অপি সরবরাহ করা হয়?
ওলেকসান্ডার পাপচেনকো

ঠিক যেমন যাচাইয়ের আদেশের উপরে যা লেখা থাকে তা অপ্রাসঙ্গিক; সে কারণেই আছে InOrder
ব্রাইস

12

আপনি Mockito.atLeastOnce()যে মকিটোকে পরীক্ষায় উত্তীর্ণ করতে পারবেন তা ব্যবহার করতে পারেন এমনকি সেই মকবজেক্টটিকে অনেকবার কল করা হলেও।

Mockito.verify(mockObject, Mockito.atLeastOnce()).testMethod(Mockito.eq(1));

Mockito.verify(mockObject, Mockito.atLeastOnce()).testMethod(Mockito.eq(2));

1

1) মোকিটোকে মোট কল প্রত্যাশা বলুন।

2) প্রতিটি প্যারামিটার সংমিশ্রণটি কতবার আশা করা হয়েছিল তা মোকিতোকে বলুন।

verify(errors, times(2)).add(any(), any(ActionMessage.class));

verify(errors, atLeastOnce()).add(eq("exception.message"), any());
verify(errors, atLeastOnce()).add(eq("exception.detail"), any());

0

@ সেন্ডোন ১৯২৮ এ একইভাবে আমরা ব্যবহার করতে পারি:

Mockito.times(wantedInvocationCount)

নিশ্চিত করার জন্য যে পদ্ধতিটি বলা হয়েছিল তার সঠিক সংখ্যা বার (আমার মতে পছন্দনীয় সমাধান)। এরপরে, আমরা কল করতে পারি

Mockito.verifyNoMoreInteractions(mock)

এটি নিশ্চিত করার জন্য যে কোনও প্রকারে মক আর ব্যবহার করা হয়নি। পুরো উদাহরণ:

Mockito.verify(mockObject, Mockito.times(wantedInvocationCount)).testMethod(Mockito.eq(1));

Mockito.verify(mockObject, Mockito.times(wantedInvocationCount)).testMethod(Mockito.eq(2));

Mockito.verifyNoMoreInteractions(mockObject)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.