/** * Invoke the @AfterClass methods if not done already * * @param testClass * @param mi */ protected void invokeAfterClassMethods(ITestClass testClass, IMethodInstance mi) { // if no BeforeClass than return immediately // used for parallel case when BeforeClass were already invoked if ((null == m_classMethodMap) || (null == m_classMethodMap.getInvokedAfterClassMethods())) { return; } ITestNGMethod[] afterClassMethods = testClass.getAfterClassMethods(); if (null == afterClassMethods || afterClassMethods.length == 0) { return; } // // Invoke after class methods if this test method is the last one // List<Object> invokeInstances = Lists.newArrayList(); ITestNGMethod tm = mi.getMethod(); if (m_classMethodMap.removeAndCheckIfLast(tm, mi.getInstances()[0])) { Map<ITestClass, Set<Object>> invokedAfterClassMethods = m_classMethodMap.getInvokedAfterClassMethods(); synchronized (invokedAfterClassMethods) { Set<Object> instances = invokedAfterClassMethods.get(testClass); if (null == instances) { instances = new HashSet<Object>(); invokedAfterClassMethods.put(testClass, instances); } for (Object inst : mi.getInstances()) { if (!instances.contains(inst)) { invokeInstances.add(inst); } } } for (Object inst : invokeInstances) { m_invoker.invokeConfigurations( testClass, afterClassMethods, m_suite, m_parameters, null, /* no parameter values */ inst); } } }