问答详情
源自:4-2 JUnit参数化设置

@runWith注解起什么作用啊?

@runWith注解起什么作用啊?

提问者:jquery 2015-05-26 17:38

个回答

  • 慕标9045768
    2020-11-19 20:04:56

    // 比如 这里有个配置类,在 src.main.java 包下面
    @Slf4j
    @Configuration
    public class RestClientConfig {
        /**
         * 支持多次使用 response.getBody() 读取流, 更多详情,请参考:https://blog.csdn.net/w1047667241/article/details/109823783
         */
        @Bean
        public RestTemplate restTemplate() {
            RestTemplate template = new RestTemplate(
                    // 多次使用 getBody() response body
                    new BufferingClientHttpRequestFactory(new HttpComponentsClientHttpRequestFactory()));
            return template;
        }
    }
    
    // 你想在 测试类里面 使用这个 Bean 对象,有2种方式,1 是 注解 @Autowired 注入;2 是 代码手动 getBean
    //方式1:
    @RunWith(SpringJUnit4ClassRunner.class)  // 在该类中运行测试,提供一些 spring 的某些特性支持
    @ContextConfiguration(classes = RestClientConfig.class) // 利用SpringJUnit4ClassRunner 注入 Bean
    public class RestTemplateConfigTest {
    
        @Autowired  //再比如这个特性,直接使用 @Autowired 
        RestTemplate restTemplate;
    
        @Test
        public void test01() {
            ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://httpbin.org/post", null, String.class);
            System.out.println("楼上的某些评论,成功的解决了提出问题的人,典型的 国产思维。这可不好呀,都是自己人。");
        }
    }
    
    // 方式2:
    // 不加 @RunWith() 
    public class RestTemplateConfigTest {
    
        @Test
        public void test02() {
            ApplicationContext context = new AnnotationConfigApplicationContext(RestClientConfig.class);
            RestTemplate restTemplate = context.getBean(RestTemplate.class);
            String object = restTemplate.getForObject("https://不要解决提出问题的人.ok?param=yes", String.class);
        }
    }





  • 连凭海临风
    2020-03-08 08:54:42

    根据Junit源码

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    @Inherited
    public @interface RunWith {
        Class<? extends Runner> value();
    }

    @RunWith注解实质上是一个接口,是用来扩展Junit的Test Runner的。

    那么什么是Test Runner呢?

    比如 Suite , Parameterized 以及 SpringTest 都是`Test Runner` ,他们都是  `org.junit.runner.Runner `的子类。

    abstract  DescriptiongetDescription()
               
    abstract  voidrun(RunNotifier notifier)
              Run the tests for this runner.
     inttestCount()

    其中有两个抽象方法 getDescription 和 run。还有一个用来统计测试执行测试的普通方法 testCount。

    那么所有想要通过扩展Junit的其他测试框架,都应遵循这个规范。

    也就是两个步骤

    1. 通过继承 org.junit.runner.Runner 实现里面的抽象方法

    2. 通过注解注入你实现的Test Runner 比如:@RunWith(YourRunnerImplement.class)

    这也就是RunWith 这个Junit注解的来龙去脉,希望 帮到你。

    参考文档:

    http://junit.sourceforge.net/javadoc/org/junit/runner/Runner.html

    http://junit.sourceforge.net/javadoc/org/junit/runner/RunWith.html




  • qq_滑稽笨Sir_0
    2017-09-12 10:50:16

    @RunWith(SpringJUnit4ClassRunner.class)使用了Spring的SpringJUnit4ClassRunner,以便在测试开始的时候自动创建Spring的应用上下文。其他的想创建spring容器的话,就得子啊web.xml配置classloder。 注解了@RunWith就可以直接使用spring容器,直接使用@Test注解,不用启动spring容器


  • qq_天启83团摩尔_03189142
    2017-08-02 13:49:25

    都知道是更改测试运行器。是在什么情况下使用更好呢。

  • lc铭
    2017-07-23 14:39:29

    大概意思是更改使用的测试类为SpringJUnit4ClassRunner.class,使之适应spring。

  • iceWang
    2017-06-12 16:43:58

    更改测试运行器

  • 慕粉4067798
    2016-10-01 15:51:09

    楼上说的一点也没用,楼主问的是作用--是让什么东西做什么,你答的算是什么东西啊,

    就像“@RunWith(JUnit4.class)就是指用JUnit4来运行"这句话,是什么让Junit4来运行什么啊,

  • Wang_Yu
    2015-05-26 21:27:53

    @RunWith就是一个运行器

    @RunWith(JUnit4.class)就是指用JUnit4来运行

    @RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境

    @RunWith(Suite.class)的话就是一套测试集合,