junit:模拟在另一个方法中调用的方法

o75abkj4  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(556)

我要上课了 Tournament 用方法 register() 以及 isAlreadyRegistered() . 下面是示例代码。

public class Tournament {

    private boolean register(String teamName) {

        if(!isAlreadyRegistered(teamName)) {

           // register team

           return True;
        }
        return False;
    }

    private boolean isAlreadyRegistered(String teamName) {
        // Check if team is already registered, involves DB calls
    }

    public static void main(String[] args) throws Exception {
        Tournament tournament = new Tournament();
        tournament.register("e-LEMON-ators");
    }
}

我有一个java测试用例,它调用类的main方法 Tournament ,这会导致 register() 方法和 register() 方法调用 isAlreadyRegistered() . 考虑以下代码:

@Test
public void testTournament() {
    try {
        Tournament.main(args);
        } catch (Exception e) {
            fail();
        }
}

我想嘲笑你 isAlreadyRegistered() ,可能使用mockito,所以它总是返回 True 注意:这个例子只是为了演示,我不能修改锦标赛类。修改只能在测试用例中进行。测试 register() 单独不是一个选项(必须通过main方法调用)
编辑:我不能为类创建对象 Tournament i、 我只能通过网络与全班互动 main() 方法

gmol1639

gmol16391#

尝试将实际的register方法调用移到另一个方法中,以便可以将tournament的示例传递给该方法。也就是说,将主方法修改为

public static void main(String[] args) throws Exception {
    Tournament tournament = new Tournament();
    performRegister(tournament);
  }

  public static void performRegister(Tournament tournament) {
    tournament.register("e-LEMON-ators");
  }

现在你的测试方法变成如下。

@Test
  public void testTournament() {
    try {
      Tournament tournament = Mockito.mock(Tournament.class);
      Mockito.when(tournament.isAlreadyRegistered(anyString())).thenReturn(true);
      Tournament.performRegister(tournament);
    } catch (Exception e) {
      fail();
    }
  }

编辑:另一个解决方案是,如果您不想修改 Tournament 类,使用 PowerMock .
这是考试班

import static org.junit.Assert.fail;
    import static org.mockito.Matchers.anyString;

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.powermock.api.mockito.PowerMockito;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(Tournament.class)
    public class TournamentTest {

      @Test
      public void testTournament() {
        try {
          Tournament mock = PowerMockito.mock(Tournament.class);
          PowerMockito.when(mock.isAlreadyRegistered(anyString())).thenReturn(true);
          PowerMockito.whenNew(Tournament.class).withAnyArguments().thenReturn(mock);
          Tournament.main(null);
        } catch (Exception e) {
          fail();
        }
      }

    }

以下是依赖项

<dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-module-junit4</artifactId>
      <version>1.6.4</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-api-mockito</artifactId>
      <version>1.6.4</version>
      <scope>test</scope>
    </dependency>

这些文件供参考 Tournament.java : https://gist.github.com/sjabiulla/4bdf71f81079e38aef137e64913bf26b TournamentTest.java : https://gist.github.com/sjabiulla/4a557516e834bba6d6047687f7e32deb pom.xml : https://gist.github.com/sjabiulla/10abb153e82e14194fd1ccc2689b192d

相关问题