Mockito। পদ্ধতি আর্গুমেন্ট যাচাই করুন


220

আমি এটি সম্পর্কে গুগল করেছি, তবে প্রাসঙ্গিক কিছু পাইনি। আমি এরকম কিছু পেয়েছি:

Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj )).thenReturn(null);

Testeable testableObj = new Testeable();
testableObj.setMockeable(mock);
command.runtestmethod();

এখন, আমি যাচাই করতে চাই mymethod(Object o), যেটিকে ভিতরে বলা হয় তাকে অন্য কোনও নয়, runtestmethod()বস্তুর সাথে ডাকা হয়েছিল o। তবে আমি সর্বদা পরীক্ষায় পাস করি, যা যাচাই করেছিলাম, উদাহরণস্বরূপ:

Mockito.verify(mock.mymethod(Mockito.eq(obj)));

অথবা

Mockito.verify(mock.mymethod(Mockito.eq(null)));

অথবা

Mockito.verify(mock.mymethod(Mockito.eq("something_else")));

আমি সবসময় পরীক্ষা পাস। আমি কীভাবে সেই যাচাইকরণটি সম্ভব (যদি সম্ভব হয়)?

ধন্যবাদ.

উত্তর:


333

এর বিকল্প ArgumentMatcherহ'ল ArgumentCaptor

সরকারী উদাহরণ:

ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);
verify(mock).doSomething(argument.capture());
assertEquals("John", argument.getValue().getName());

একটি ক্যাপ্টরকে @ ক্যাপ্টর টিকাটি ব্যবহার করে সংজ্ঞায়িত করা যায় :

@Captor ArgumentCaptor<Person> captor;
//... MockitoAnnotations.initMocks(this);
@Test public void test() {
    //...
    verify(mock).doSomething(captor.capture());
    assertEquals("John", captor.getValue().getName());
}

1
নমুনার জন্য ধন্যবাদ! এটি কখনও ব্যবহার করা হয়নি। কোডটিতে ক্যাপ্টরের মতো জিনিসগুলি কিছুটা অদ্ভুত বলে মনে হয় তবে এটি সাহায্য করেছিল।
আর্টেমিস

1
হা হা, আমি প্রশ্নটি বুঝতে পারি নি, তবে উত্তরটি আমাকে অনেক সাহায্য করেছিল। ধন্যবাদ :-)
মার্কাস কে।

13
গুরুত্বপূর্ণ: মোক ব্যবহারের পরে কল করুন () / ক্যাপচার () । আমি ভাবছিলাম এটি আগে "ইনস্টল" করা উচিত ...
ড্যানিয়েল অ্যাল্ডার

1
এই উত্তরের জন্য ধন্যবাদ!
জোসে ফ্ল্যাভিও কুইসপ ইরাজাবাল

এটি একটি দুর্দান্ত উত্তর !! আপনাকে অনেক ধন্যবাদ!
উলকি ইগর

61

আপনি কি অবজেক্টের .Equals পদ্ধতিটি ব্যবহার করে যৌক্তিক সমতা করার চেষ্টা করছেন? আপনি এটি মকিতোতে অন্তর্ভুক্ত থাকা আরগথ্যাট ম্যাচারটি ব্যবহার করে করতে পারেন

import static org.mockito.Matchers.argThat

এরপরে আপনি আপনার নিজের যুক্তি ম্যাচারের প্রয়োগ করতে পারেন যা প্রতিটি বস্তুর জন্যই স্থগিত করে e

private class ObjectEqualityArgumentMatcher<T> extends ArgumentMatcher<T> {
    T thisObject;

    public ObjectEqualityArgumentMatcher(T thisObject) {
        this.thisObject = thisObject;
    }

    @Override
    public boolean matches(Object argument) {
        return thisObject.equals(argument);
    }
}

এখন আপনার কোড ব্যবহার করে আপনি এটি পড়তে আপডেট করতে পারেন ...

Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj)).thenReturn(null);

Testeable obj = new Testeable();
obj.setMockeable(mock);
command.runtestmethod();

verify(mock).mymethod(argThat(new ObjectEqualityArgumentMatcher<Object>(obj)));

যদি আপনি ঠিক সমান সমতা (মেমরিতে একই জিনিস) জন্য যাচ্ছেন তবে ঠিক করুন

verify(mock).mymethod(obj);

এটি যাচাই করা হবে একবার এটি বলা হয়েছিল।


1
আপনি ReflectionEqualsসেই উদ্দেশ্যে বিল্ড ইন ক্লাসটি ব্যবহার করতে পারেন ।
টাকসোট

2
আপনার উত্তরের জন্য +1। তবে আমি যুক্ত করতে চাই যে verify(mock).mymethod(obj);ঠিক সমানতা (মেমরিতে একই জিনিস) যাচাই করে না। পরিবর্তে এটি বস্তুর সমান-পদ্ধতিটি ব্যবহার করে যা ওভাররাইড করা যেতে পারে।
ইফাক্স 20'15

আপনি ArgumentMatcherকম ভার্বোস হতে বেনামে একটি বাস্তবায়নও তৈরি করতে পারেন ।
botchniaque

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

54
  • আপনি eqযদি অন্য ম্যাথার ব্যবহার না করেন তবে আপনার ম্যাচারের দরকার নেই।
  • আপনি সঠিক বাক্য গঠন ব্যবহার করছেন না - আপনার মেথড কলটি এর বাইরে হওয়া উচিত .verify(mock)। আপনি এখন কোনও কিছু যাচাই না করেই পদ্ধতি কলের ফলাফলের ভিত্তিতে যাচাইকরণ শুরু করছেন (কোনও পদ্ধতি কল করছেন না)। অতএব সমস্ত পরীক্ষা পাস হয়।

আপনার কোডটি দেখতে এমন হওয়া উচিত:

Mockito.verify(mock).mymethod(obj);
Mockito.verify(mock).mymethod(null);
Mockito.verify(mock).mymethod("something_else");

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

2
এটি রেফারেন্স অনুসারে
Verifis

16

argThat প্লাস ল্যাম্বদা

এভাবেই আপনি নিজের যুক্তি যাচাইকরণ ব্যর্থ করতে পারেন:

    verify(mock).mymethod(argThat(
      (x)->false
    ));

কোথায়

import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;

argThat প্লাস জোর

উপরের পরীক্ষাটি "বলবে" Expected: lambda$... Was: YourClass.toSting...। ল্যাম্বডায় দৃser় সংস্থান ব্যবহার করতে পারলে আপনি ব্যর্থতার আরও নির্দিষ্ট কারণ পেতে পারেন:

    verify(mock).mymethod(argThat( x -> {
      assertThat(x).isNotNull();
      assertThat(x.description).contains("KEY");
      return true;
    }));

বাট: এই 1 টি মেথড কল দিয়ে কাজ করে। যদি যাচাই পদ্ধতিটি 2+ বার বলা হয়, মকিতো প্রতিটি যাচাইকারীকে কলযুক্ত সমস্ত সংযুক্তি পাস করে। সুতরাং মকিতো আশা করছে যে আপনার যাচাইকারীটি trueআর্গুমেন্ট সেটগুলির মধ্যে একটির জন্য নিঃশব্দে ফিরে আসে , এবং falseঅন্যান্য বৈধ কলগুলির জন্য (কোনও ব্যতিক্রম দৃsert় নেই)। সেই প্রত্যাশাটি 1 পদ্ধতি কলের জন্য কোনও সমস্যা নয় - এটি ঠিক 1 বার ফিরে আসা উচিত।

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;

এখন পরীক্ষা বলে: Expected: Obj.description to contain 'KEY'. Was: 'Actual description'। দ্রষ্টব্য: আমি assertJদৃser়পদগুলি ব্যবহার করেছি , তবে কোনটি দৃ as় কাঠামো ব্যবহার করা উচিত তা আপনার বিষয় to


argThat একাধিক যুক্তি সহ।

আপনি ব্যবহার করেন তাহলে argThat, সব আর্গুমেন্ট মিল সহ প্রদান করা আবশ্যক। উদাহরণ:

    verify(mock).mymethod(eq("VALUE_1"), argThat((x)->false));
    // above is correct as eq() is also an argument matcher.

verify(mock).mymethod("VALUE_1", argThat((x)->false));

// above is incorrect; an exceptoin will be thrown, as the fist arg. is given without an argument matcher.

কোথায়:

import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;

eq মিলকারীর

যুক্তিটি সমান কিনা তা যাচাই করার সহজ উপায়:

verify(mock).mymethod(eq(expectedValue));
// NOTE:   ^ where the parentheses must be closed.

প্রত্যক্ষ যুক্তি

রেফ দ্বারা তুলনা যদি গ্রহণযোগ্য হয়, তবে সাথে যান:

verify(mock).mymethod(expectedArg);
// NOTE:   ^ where the parentheses must be closed.

মূল প্রশ্ন ব্যর্থতার মূল কারণ paranthes এর ভুল জায়গায় ছিল: verify(mock.mymethod...। এটা ভুল ছিল। ডান হবে:verify(mock).*


1
এটি আমার প্রিয় উত্তর, কাজগুলি এবং অন্যদের চেয়ে অনেক বেশি মার্জিত is
এয়ারওয়েভজেক্স 13

11

আমি এইভাবে মকিতো.ভার্ফাইড ব্যবহার করেছি

@UnitTest
public class JUnitServiceTest
{
    @Mock
    private MyCustomService myCustomService;


    @Test
    public void testVerifyMethod()
    {
       Mockito.verify(myCustomService, Mockito.never()).mymethod(parameters); // method will never call (an alternative can be pick to use times(0))
       Mockito.verify(myCustomService, Mockito.times(2)).mymethod(parameters); // method will call for 2 times
       Mockito.verify(myCustomService, Mockito.atLeastOnce()).mymethod(parameters); // method will call atleast 1 time
       Mockito.verify(myCustomService, Mockito.atLeast(2)).mymethod(parameters); // method will call atleast 2 times
       Mockito.verify(myCustomService, Mockito.atMost(3)).mymethod(parameters); // method will call at most 3 times
       Mockito.verify(myCustomService, Mockito.only()).mymethod(parameters); //   no other method called except this
    }
}

5

আপনি কি উপহাসযোগ্য শ্রেণীর জন্য সমান পদ্ধতিটি পরীক্ষা করেছেন? যদি এটি সর্বদা সত্য প্রত্যাবর্তিত হয় বা আপনি একই উদাহরণটির বিরুদ্ধে একই উদাহরণটি পরীক্ষা করেন এবং সমান পদ্ধতিটি ওভাররাইট না করা হয় (এবং কেবলমাত্র রেফারেন্সগুলির বিরুদ্ধে পরীক্ষা করা হয়), তবে এটি সত্য হয়।


4

অন্য পদ্ধতিটি হ'ল org.mockito.intern.matchers.Equals.Equals পদ্ধতিটি পুনরায় সংজ্ঞায়নের পরিবর্তে ব্যবহার করুন:

verify(myMock).myMethod((inputObject)Mockito.argThat(new Equals(inputObjectWanted)));

3

আপনি কি একই () ম্যাচার দিয়ে চেষ্টা করেছেন? হিসাবে:

verify(mockObj).someMethod(same(specificInstance));

আমারও একই সমস্যা ছিল। আমি এটি ইকি () ম্যাচারের পাশাপাশি রেফেক () ম্যাচারের মাধ্যমে চেষ্টা করেছিলাম তবে আমার সর্বদা মিথ্যা ইতিবাচক ছিল। যখন আমি একই () ম্যাচার ব্যবহার করতাম তখন পরীক্ষাটি ব্যর্থ হয় যখন আর্গুমেন্টগুলি পৃথক দৃষ্টান্ত ছিল এবং একবার যুক্তিগুলি একই উদাহরণ হিসাবে পাস হয়েছিল passed


-1

আপনি টাইপসেফ-ডায়াগনসোম্যাচার ব্যবহার করতে পারেন

    private Matcher<GetPackagesRequest> expectedPackageRequest(final AvailabilityRequest request) {
    return new TypeSafeDiagnosingMatcher<GetPackagesRequest>() {

        StringBuilder text = new StringBuilder(500);

        @Override
        protected boolean matchesSafely(GetPackagesRequest req, Description desc) {
            String productCode = req.getPackageIds().iterator().next().getValue();
            if (productCode.equals(request.getSupplierProductCode())) {
                text.append("ProductCode not equal! " + productCode + " , " + request.getSupplierProductCode());
                return true;
            }

            text.append(req.toString());
            return false;
        }

        @Override
        public void describeTo(Description d) {
            d.appendText(text.toString());
        }
    };
}

তারপরে সেই অনুরোধটি যাচাই করুন:

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