diff --git a/core/modules/views/lib/Drupal/views/Tests/ViewsHooksTest.php b/core/modules/views/lib/Drupal/views/Tests/ViewsHooksTest.php
index 745a28c..ad98fa6 100644
--- a/core/modules/views/lib/Drupal/views/Tests/ViewsHooksTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/ViewsHooksTest.php
@@ -16,42 +16,83 @@
 class ViewsHooksTest extends ViewUnitTestBase {
 
   /**
-   * Modules to enable.
+   * Views used by this test.
    *
    * @var array
    */
-  public static $modules = array('views_test_data');
+  public static $testViews = array('test_view');
+
+  /**
+   * An array of available views hooks to test.
+   *
+   * @var array
+   */
+  protected static $hooks = array (
+    'views_data' => 'all',
+    'views_data_alter' => 'alter',
+    'views_query_substitutions' => 'view',
+    'views_form_substitutions' => 'view',
+    'views_analyze' => 'view',
+    'views_pre_view' => 'view',
+    'views_pre_build' => 'view',
+    'views_post_build' => 'view',
+    'views_pre_execute' => 'view',
+    'views_post_execute' => 'view',
+    'views_pre_render' => 'view',
+    'views_post_render' => 'view',
+    'views_query_alter'  => 'view',
+    'views_invalidate_cache' => 'all',
+  );
+
+  /**
+   * The module handler to use for invoking hooks.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
 
   public static function getInfo() {
     return array(
-      'name' => 'Views Hooks',
+      'name' => 'Views hooks',
       'description' => 'Tests that views hooks are registered when defined in $module.views.inc.',
       'group' => 'Views',
     );
   }
 
+  protected function setUp() {
+    parent::setUp();
+
+    $this->moduleHandler = $this->container->get('module_handler');
+  }
+
   /**
    * Tests the hooks.
    */
   public function testHooks() {
-    $hooks = &drupal_static(__FUNCTION__);
-
-    $views_hooks = array(
-      'views_data',
-      'views_data_alter',
-      'views_query_substitutions',
-      'views_form_substitutions',
-      'field_views_data',
-      'field_views_data_alter',
-    );
+    $view = views_get_view('test_view');
+
+    // Test each hook is found in the implementations array and is invoked.
+    foreach (static::$hooks as $hook => $type) {
+      $this->assertTrue($this->moduleHandler->implementsHook('views_test_data', $hook), format_string('The hook @hook was registered.', array('@hook' => $hook)));
+
+      switch ($type) {
+        case 'view':
+          $this->moduleHandler->invoke('views_test_data', $hook, array($view));
+          break;
+
+        case 'alter':
+          $data = array();
+          $this->moduleHandler->invoke('views_test_data', $hook, array($data));
+          break;
 
-    foreach ($views_hooks as $hook) {
-      $implementations = module_implements($hook);
-      $this->assertTrue(in_array('views_test_data', $implementations), format_string('The hook @hook was registered.', array('@hook' => $hook)));
+        default:
+          $this->moduleHandler->invoke('views_test_data', $hook);
+      }
 
-      // Reset the module implements cache, so we ensure that the .views.inc
-      // file is loaded actively.
-      unset($hooks['implementations']);
+      $this->assertTrue($this->container->get('state')->get('views_hook_test_' . $hook), format_string('The %hook hook was invoked.', array('%hook' => $hook)));
+      // Reset the module implementations cache, so we ensure that the
+      // .views.inc file is loaded actively.
+      $this->moduleHandler->resetImplementations();
     }
   }
 
diff --git a/core/modules/views/tests/views_test_data/views_test_data.module b/core/modules/views/tests/views_test_data/views_test_data.module
index 40467c6..a4ae6e4 100644
--- a/core/modules/views/tests/views_test_data/views_test_data.module
+++ b/core/modules/views/tests/views_test_data/views_test_data.module
@@ -63,23 +63,6 @@ function views_test_data_handler_test_access_callback_argument($argument = FALSE
   }
 }
 
-
-/**
- * Implements hook_views_pre_render().
- *
- * @see \Drupal\views\Tests\Plugin\CacheTest
- * @see \Drupal\views\Tests\Plugin\RenderTest
- */
-function views_test_data_views_pre_render(ViewExecutable $view) {
-  if ($view->storage->id() == 'test_cache_header_storage') {
-    $path = drupal_get_path('module', 'views_test_data');
-    $view->element['#attached']['js'][] = "$path/views_cache.test.js";
-    $view->element['#attached']['css'][] = "$path/views_cache.test.css";
-    $view->build_info['pre_render_called'] = TRUE;
-  }
-
-}
-
 /**
  * Implements hook_preprocess_HOOK() for views-view-table.tpl.php.
  */
@@ -92,20 +75,6 @@ function views_test_data_preprocess_views_view_table(&$variables) {
 }
 
 /**
- * Implements hook_views_post_build().
- */
-function views_test_data_views_post_build(ViewExecutable $view) {
-  if ($view->storage->id() == 'test_page_display') {
-    if ($view->current_display == 'page_1') {
-      $view->build_info['denied'] = TRUE;
-    }
-    elseif ($view->current_display == 'page_2') {
-      $view->build_info['fail'] = TRUE;
-    }
-  }
-}
-
-/**
  * Implements hook_preprocess_HOOK() for theme_views_view_mapping_test().
  */
 function template_preprocess_views_view_mapping_test(&$variables) {
diff --git a/core/modules/views/tests/views_test_data/views_test_data.views.inc b/core/modules/views/tests/views_test_data/views_test_data.views.inc
index ff940f7..4d931f5 100644
--- a/core/modules/views/tests/views_test_data/views_test_data.views.inc
+++ b/core/modules/views/tests/views_test_data/views_test_data.views.inc
@@ -12,6 +12,8 @@
  * Implements hook_views_analyze().
  */
 function views_test_data_views_analyze(ViewExecutable $view) {
+  state()->set('views_hook_test_views_analyze', TRUE);
+
   $ret = array();
 
   $ret[] = Analyzer::formatMessage(t('Test ok message'), 'ok');
@@ -25,40 +27,131 @@ function views_test_data_views_analyze(ViewExecutable $view) {
  * Implements hook_views_data().
  */
 function views_test_data_views_data() {
+  state()->set('views_hook_test_views_data', TRUE);
   return state()->get('views_test_data_views_data');
 }
 
 /**
  * Implements hook_views_data_alter().
  */
-function views_test_data_views_data_alter(&$data) {
-
+function views_test_data_views_data_alter() {
+  state()->set('views_hook_test_views_data_alter', TRUE);
 }
 
 /**
  * Implements hook_views_query_substitutions().
  */
-function views_test_data_views_query_substitutions() {
-
+function views_test_data_views_query_substitutions(ViewExecutable $view) {
+  state()->set('views_hook_test_views_query_substitutions', TRUE);
 }
 
 /**
  * Implements hook_views_form_substitutions().
  */
-function views_test_data_views_form_substitutions() {
-
+function views_test_data_views_form_substitutions(ViewExecutable $view) {
+  state()->set('views_hook_test_views_form_substitutions', TRUE);
 }
 
 /**
  * Implements hook_field_views_data().
  */
 function views_test_data_field_views_data($field) {
-
+  state()->set('views_hook_test_field_views_data', TRUE);
 }
 
 /**
  * Implements hook_field_views_data_alter().
  */
 function views_test_data_field_views_data_alter(&$data, $field, $module) {
+  state()->set('views_hook_test_field_views_data_alter', TRUE);
+}
+
+/**
+ * Implements hook_views_pre_render().
+ *
+ * @see \Drupal\views\Tests\Plugin\CacheTest
+ * @see \Drupal\views\Tests\Plugin\RenderTest
+ */
+function views_test_data_views_pre_render(ViewExecutable $view) {
+  state()->set('views_hook_test_views_pre_render', TRUE);
+
+  if (isset($view) && ($view->storage->id() == 'test_cache_header_storage')) {
+    $path = drupal_get_path('module', 'views_test_data');
+    $view->element['#attached']['js'][] = "$path/views_cache.test.js";
+    $view->element['#attached']['css'][] = "$path/views_cache.test.css";
+    $view->build_info['pre_render_called'] = TRUE;
+  }
+
+}
+
+/**
+ * Implements hook_views_post_render().
+ */
+function views_test_data_views_post_render(ViewExecutable $view) {
+  state()->set('views_hook_test_views_post_render', TRUE);
+}
+
+/**
+ * Implements hook_views_pre_build().
+ */
+function views_test_data_views_pre_build(ViewExecutable $view) {
+  state()->set('views_hook_test_views_pre_build', TRUE);
+}
+
+/**
+ * Implements hook_views_post_build().
+ */
+function views_test_data_views_post_build(ViewExecutable $view) {
+  state()->set('views_hook_test_views_post_build', TRUE);
+
+  if (isset($view) && ($view->storage->id() == 'test_page_display')) {
+    if ($view->current_display == 'page_1') {
+      $view->build_info['denied'] = TRUE;
+    }
+    elseif ($view->current_display == 'page_2') {
+      $view->build_info['fail'] = TRUE;
+    }
+  }
+}
+
+/**
+ * Implements hook_views_pre_view().
+ */
+function views_test_data_views_pre_view(ViewExecutable $view) {
+  state()->set('views_hook_test_views_pre_view', TRUE);
+}
+
+/**
+ * Implements hook_views_pre_execute().
+ */
+function views_test_data_views_pre_execute(ViewExecutable $view) {
+  state()->set('views_hook_test_views_pre_execute', TRUE);
+}
 
+/**
+ * Implements hook_views_post_execute().
+ */
+function views_test_data_views_post_execute(ViewExecutable $view) {
+  state()->set('views_hook_test_views_post_execute', TRUE);
+}
+
+/**
+ * Implements hook_views_query_alter().
+ */
+function views_test_data_views_query_alter(ViewExecutable $view) {
+  state()->set('views_hook_test_views_query_alter', TRUE);
+}
+
+/**
+ * Implements hook_views_preview_info_alter().
+ */
+function views_test_data_views_preview_info_alter(ViewExecutable $view) {
+  state()->set('views_hook_test_views_preview_info_alter', TRUE);
+}
+
+/**
+ * Implements hook_views_invalidate_cache().
+ */
+function views_test_data_views_invalidate_cache() {
+  state()->set('views_hook_test_views_invalidate_cache', TRUE);
 }
diff --git a/core/modules/views/views.module b/core/modules/views/views.module
index 8dc5f5a..c099530 100644
--- a/core/modules/views/views.module
+++ b/core/modules/views/views.module
@@ -821,26 +821,24 @@ function &views_get_current_view() {
  * Implements hook_hook_info().
  */
 function views_hook_info() {
-  $hooks['views_data'] = array(
-    'group' => 'views',
-  );
-  $hooks['views_data_alter'] = array(
-    'group' => 'views',
-  );
-  $hooks['views_query_substitutions'] = array(
-    'group' => 'views',
-  );
-  $hooks['views_form_substitutions'] = array(
-    'group' => 'views',
-  );
-  $hooks['views_analyze'] = array(
-    'group' => 'views',
-  );
-  $hooks['views_data_alter'] = array(
-    'group' => 'views',
+  $hooks = array (
+    'views_data',
+    'views_data_alter',
+    'views_query_substitutions',
+    'views_form_substitutions',
+    'views_analyze',
+    'views_pre_view',
+    'views_pre_build',
+    'views_post_build',
+    'views_pre_execute',
+    'views_post_execute',
+    'views_pre_render',
+    'views_post_render',
+    'views_query_alter',
+    'views_invalidate_cache',
   );
 
-  return $hooks;
+  return array_fill_keys($hooks, array('group' => 'views'));
 }
 
 /**
