কীভাবে যাচাই করবেন যে মকিতো ব্যবহার করে কোনও নির্দিষ্ট পদ্ধতি বলা হয়নি?


625

কোনও পদ্ধতির কোনও অবজেক্টের নির্ভরতার উপর নির্ভর করা হয় না তা যাচাই করবেন কীভাবে ?

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

public interface Dependency {
    void someMethod();
}

public class Foo {
    public bar(final Dependency d) {
        ...
    }
}

ফু পরীক্ষা দিয়ে:

public class FooTest {
    @Test
    public void dependencyIsNotCalled() {
        final Foo foo = new Foo(...);
        final Dependency dependency = mock(Dependency.class);
        foo.bar(dependency);
        **// verify here that someMethod was not called??**
    }
}

উত্তর:


1087

আরও বেশি অর্থবহ:

import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;

// ...

verify(dependency, never()).someMethod();

এই বৈশিষ্ট্যের ডকুমেন্টেশনটি এখানে §4 "অনুরোধের সঠিক সংখ্যা যাচাই করা / কমপক্ষে x / কখনই নয়" এবং neverজাভাদোকটি এখানে রয়েছে


144
ব্যবহার neverসবচেয়ে ভাল এবং সবচেয়ে নির্দিষ্ট উপায়, কিন্তু আপনি একটি সম্পূর্ণ উপহাস বস্তুর চেক করতে হবে যদি, এছাড়াও বিবেচনা verifyZeroInteractions(mockObject)বা verifyNoMoreInteractions(mockObject)
জেফ বোম্যান

যদি কোনও মেঠোড বেসরকারী হয় তবে কী করবেন ??
সুমিত কুমার সাহা

1
তারপরে আপনি এটিকে প্রথম স্থানে উপহাস করতে পারবেন না (মকিতো সহ);) পাওয়ারমক এটির অনুমতি দেয় তবে এটি সেট আপ করা আরও জটিল। বা কোডটির মালিকানা থাকলে আপনার প্যাকেজের দৃশ্যমানতা শিথিল।
ব্রাইস

2
৩.০.১ verifyZeroInteractionsথেকে অবচিত করা হয়েছে। verifyNoInteractions প্রস্তাবিত বিকল্প। এই মন্তব্যের সময় মকিতো সংস্করণটি 3.3.3
ভিকেবি

108

Mockito.verifyপদ্ধতিটিতে দ্বিতীয় যুক্তিটি ব্যবহার করুন :

verify(dependency, Mockito.times(0)).someMethod()


11
পাবলিক স্ট্যাটিক ভেরিফিকেশনমড কখনই () {রিটার্ন সময় (0); }
gbero

3
never()এর চেয়ে উল্লেখযোগ্যভাবে বেশি পঠনযোগ্য নয় times(0)। তবে এর অস্তিত্ব neverজ্ঞানীয় বোঝা বাড়িয়ে তোলে এবং মকিতো সিস্টেমটিকে কীভাবে ব্যবহার করবেন তা বোঝার এবং মনে রাখা শক্ত করে তোলে। সুতরাং সত্যই মকিতো neverতাদের এপিআইতে অন্তর্ভুক্ত করা উচিত নয় , এটি মানসিক ব্যয়ের জন্য মূল্যহীন।
বিটি

প্রশ্ন: এই ফর্মটি someMethodযা 0 বার বলা হয়েছিল যাচাই করে , বা এটি কেবল someMethodযা যা শূন্য আর্গুমেন্টের সাথে বলা হয় নি তা যাচাই করে ?
বিটি

@ বিটি - আমি কল্পনা করব যে এটি someMethodশূন্য আর্গুমেন্টের সাথে যাচাই করে শূন্য বার বলা হয়েছিল - যাচাই করা হয়নি।
বেলুচিন

18

অনুসরণ করার আরও সাধারণ প্যাটার্ন হিসাবে, আমি @Afterপরীক্ষায় একটি ব্লক ব্যবহার করার প্রবণতা রাখি :

@After
public void after() {
    verifyNoMoreInteractions(<your mock1>, <your mock2>...);
}

তারপরে যা পরীক্ষা করা উচিত তা যাচাই করার জন্য পরীক্ষাটি নিখরচায় ।

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

সুতরাং আমি এই প্যাটার্নটি এমন সমস্ত অপ্রত্যাশিত কলগুলি ধরার জন্য দরকারী যা বিশেষভাবে যাচাই করা হয়নি।


9
মকিতো ডকুমেন্টেশনে বলা হয়েছে যে এই নিদর্শনটিকে অপব্যবহার করা উচিত নয় - "সতর্কতার শব্দ: কিছু ব্যবহারকারী যারা প্রচুর ক্লাসিক, প্রত্যাশিত-যাচাই-বাছাই করা উপহাস করেছেন তা এমনকি প্রতিটি পরীক্ষার পদ্ধতিতেও যাচাই-বাছাই করা (NoNoreMoreInteferences)) প্রায়শই ব্যবহার করে। () প্রতিটি পরীক্ষার পদ্ধতিতে ব্যবহারের জন্য সুপারিশ করা হয় না verify যাচাইকরণমোরইন্টেকেরেশনস () ইন্টারঅ্যাকশন টেস্টিং টুলকিট থেকে একটি সহজ বক্তব্য। এটি প্রাসঙ্গিক হলেই এটি ব্যবহার করুন it এটির অপব্যবহারের ফলে ওভারস্পিডড, কম রক্ষণাবেক্ষণযোগ্য পরীক্ষার দিকে পরিচালিত হয় "" এখানে
চাদী

2
"এটি প্রাসঙ্গিক হলেই এটি ব্যবহার করুন"। আমি মনে করি এটি সর্বদা প্রাসঙ্গিক। আমি সেই নিদর্শনটিকে অপব্যবহার হিসাবে দেখছি না: যেমনটি আমি বলেছিলাম, এটি "জিনিসকে বলা হত যা করা উচিত ছিল না" বলে মনে হয়। আমার কাছে, এটি যাচাইকরণের একটি অত্যাবশ্যক টুকরো: কোনও জিনিস যদি এমন কোনও ভাণ্ডার কল করে যা এটি ব্যবহার করা উচিত নয়, তবে আমি এটি সম্পর্কে জানতে চাই! ব্যবহার না করে যাচাই করার অন্য কোনও উপায় না থাকলে verifyNoMoreInteractions? অন্য উত্তরগুলি এখানে পরীক্ষক লেখকের উপর নির্ভর করে এই চেকগুলি তালিকাভুক্ত করার জন্য মনে রাখে: এটি আমার বইতে খুব ত্রুটিযুক্ত।
ডেভিড ল্যাভেন্ডার

2
আমি এই মন্তব্যটি দেখেছি, তবে মনে হয়েছে যুক্তিটি বাধ্যতামূলক নয়। কেন এটি প্রস্তাবিত নয় সে সম্পর্কে আরও পড়তে চাই love
tobinibot

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

8

প্রথমত: আপনার সর্বদা মকিতো স্ট্যাটিক আমদানি করা উচিত, এইভাবে কোডটি আরও বেশি পঠনযোগ্য (এবং স্বজ্ঞাত) হবে:

import static org.mockito.Mockito.*;

এটি অর্জন করার জন্য আসলে অনেকগুলি উপায় রয়েছে তবে এটি ব্যবহার করার জন্য এটি (তর্কযুক্ত) ক্লিনার

verify(yourMock, times(0)).someMethod();

আপনার সমস্ত পরীক্ষাগুলির সমস্ত পদ্ধতি, যখন অন্যান্য টেস্টগুলিতে আপনি নির্দিষ্ট পরিমাণের মৃত্যুদণ্ড কার্যকর করার জন্য এটি ব্যবহার করেন:

verify(yourMock, times(5)).someMethod();

বিকল্পগুলি হ'ল:

verify(yourMock, never()).someMethod();

বিকল্পভাবে - যখন আপনি সত্যিই নিশ্চিত করতে চান যে কোনও নির্দিষ্ট উপহাসকৃত বস্তুকে আসলেই ডাকা হয় নি - আপনি ব্যবহার করতে পারেন:

verifyZeroInteractions(yourMock)

7

অভ্যন্তরীণভাবে verifyNoMoreInteractions()এবং verifyZeroInteractions()পদ্ধতি উভয়েরই একই বাস্তবায়ন রয়েছে:

public static transient void verifyNoMoreInteractions(Object mocks[])
{
    MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}

public static transient void verifyZeroInteractions(Object mocks[])
{
    MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}

তাই আমরা মক অবজেক্ট বা মেক অবজেক্টগুলির অ্যারেতে তাদের যে কোনও একটি ব্যবহার করতে পারি তা পরীক্ষা করে দেখুন যে মক অবজেক্টগুলি ব্যবহার করে কোনও পদ্ধতি কল করা হয়নি।

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