Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
290 views
in Technique[技术] by (71.8m points)

java - How to mock another method in the same class which is being tested?

I am writing JUnit Test case for a class which has two methods methodA,methodB. I would like to mock the call to the methodB from methodA in my test case I am using spy on the class which I am testing, but still the methodB gets executed.

here is the class

 public class SomeClass
{

     public Object methodA(Object object) 
    {
         object=methodB(object);

        return object;
    }



    public Object methodB(Object object) 
    {
        //do somthing
        return object;
    }
}

here is the test class

  @RunWith( org.powermock.modules.junit4.legacy.PowerMockRunner.class )
    @PrepareForTest(SomeClass.class)
    public class SomeClassTest { 

        private SomeClass var = null; 


        @Before
        public void setUp() {

            var=new SomeClass();

        }

        @After
        public void tearDown()
            {
            var= null;

        }

        @Test
        public void testMethodA_1()
            throws Exception {
            Object object =new Object();
        SomeClass spy_var=PowerMockito.spy(var);
        PowerMockito.when(spy_var.methodB(object)).thenReturn(object);

    Object result = var.methodA(object);        

        assertNotNull(result);

        }

    }

The method B still gets the called though I have mocked it PLease suggest me a solution with the proper way of mocking the methodB call from methodA of the same class.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Taking this approach will result in brittle tests which will need to change if you refactor your class under test. I would highly recommend that you try to assert your expected test results by checking state of SomeClass rather than relying on mocks.

If you do indeed need to mock MethodB then this is an indication that maybe the behaviour in MethodB actually belongs in a separate class which you could then test the interaction of SomeClass with via mocks

if you do indeed need to do what you ask for then a PartialMock is what you want.

you probably want to create a partial mock of some class but indicate that calls to MethodA should call the actual method but then mock MethodB

You can see how to use them in the Mockito documentation

As stated in their documentation though Partial mocks are a code smell, though they have identified some explicit use cases.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...