diff --git src/includes/extend/buddypress/groups.php src/includes/extend/buddypress/groups.php
index c07202e..d6fa24d 100644
--- src/includes/extend/buddypress/groups.php
+++ src/includes/extend/buddypress/groups.php
@@ -143,6 +143,9 @@ class BBP_Forums_Group_Extension extends BP_Group_Extension {
 			add_filter( 'bbp_current_user_can_access_create_topic_form', array( $this, 'form_permissions' ) );
 			add_filter( 'bbp_current_user_can_access_create_reply_form', array( $this, 'form_permissions' ) );
 		}
+
+		// Enforce forum privacy.
+		add_filter( 'bbp_is_forum_public', array( $this, 'enforce_forum_privacy' ), 10, 3 );
 	}
 
 	/**
@@ -1462,5 +1465,23 @@ class BBP_Forums_Group_Extension extends BP_Group_Extension {
 
 		return $args;
 	}
+
+	public function enforce_forum_privacy( $is_public, $forum_id, $check_ancestors ) {
+		$group_ids = bbp_get_forum_group_ids( $forum_id );
+
+		if ( ! empty( $group_ids ) ) {
+			foreach ( $group_ids as $group_id ) {
+				$group = groups_get_group( array( 'group_id' => $group_id ) );
+
+				// A single non-public group will force the forum to private.
+				if ( 'public' !== $group->status ) {
+					$is_public = false;
+					break;
+				}
+			}
+		}
+
+		return $is_public;
+	}
 }
 endif;
diff --git tests/phpunit/bootstrap.php tests/phpunit/bootstrap.php
index 7c981a3..c0489d6 100644
--- tests/phpunit/bootstrap.php
+++ tests/phpunit/bootstrap.php
@@ -21,6 +21,10 @@ if ( ! file_exists( WP_TESTS_DIR . '/includes/functions.php' ) ) {
  * Load bbPress's PHPUnit test suite loader
  */
 function _load_loader() {
+	// If BuddyPress is found, set it up and require it.
+	if ( defined( 'BP_TESTS_DIR' ) ) {
+		require BP_TESTS_DIR . '/includes/loader.php';
+	}
 	require( BBP_TESTS_DIR . '/includes/loader.php' );
 }
 tests_add_filter( 'muplugins_loaded', '_load_loader' );
@@ -30,3 +34,9 @@ require( WP_TESTS_DIR . '/includes/bootstrap.php' );
 
 echo "Loading bbPress testcase...\n";
 require( BBP_TESTS_DIR . '/includes/testcase.php' );
+require( BBP_TESTS_DIR . '/includes/factory.php' );
+
+if ( defined( 'BP_TESTS_DIR' ) ) {
+	echo "Loading BuddyPress testcase...\n";
+	require BP_TESTS_DIR . '/includes/testcase.php';
+}
diff --git tests/phpunit/includes/define-constants.php tests/phpunit/includes/define-constants.php
index 7c5bac3..fba9961 100755
--- tests/phpunit/includes/define-constants.php
+++ tests/phpunit/includes/define-constants.php
@@ -52,3 +52,11 @@ if ( file_exists( WP_ROOT_DIR . '/wp-tests-config.php' ) ) {
 } else {
 	die( "wp-tests-config.php could not be found.\n" );
 }
+
+// Determine whether BuddyPress is present.
+if ( ! defined( 'BP_TESTS_DIR' ) ) {
+	$wp_content_dir = dirname( dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) );
+	if ( file_exists( $wp_content_dir . '/buddypress/tests/phpunit/bootstrap.php' ) ) {
+		define( 'BP_TESTS_DIR', $wp_content_dir . '/buddypress/tests/phpunit' );
+	}
+}
diff --git tests/phpunit/includes/factory.php tests/phpunit/includes/factory.php
index 261d216..c6631da 100755
--- tests/phpunit/includes/factory.php
+++ tests/phpunit/includes/factory.php
@@ -1,7 +1,35 @@
 <?php
 
 class BBP_UnitTest_Factory extends WP_UnitTest_Factory {
-	function __construct() {
+	public $forum = null;
+
+	public function __construct() {
 		parent::__construct();
+
+		$this->forum = new BBP_UnitTest_Factory_For_Forum( $this );
+	}
+}
+
+class BBP_UnitTest_Factory_For_Forum extends WP_UnitTest_Factory_For_Thing {
+	public function __construct( $factory = null ) {
+		parent::__construct( $factory );
+
+		$this->default_generation_definitions = array(
+			'post_title' => new WP_UnitTest_Generator_Sequence( 'Forum %s' ),
+			'post_content' => new WP_UnitTest_Generator_Sequence( 'Content of Forum %s' ),
+		);
+	}
+
+	public function create_object( $args ) {
+		return bbp_insert_forum( $args );
+	}
+
+	public function update_object( $forum_id, $fields ) {
+		$fields['forum_id'] = $forum_id;
+		return bbp_update_forum( $fields );
+	}
+
+	public function get_object_by_id( $forum_id ) {
+		return get_post( $forum_id );
 	}
 }
diff --git tests/phpunit/includes/loader.php tests/phpunit/includes/loader.php
index 3bc9c7e..d0c987e 100755
--- tests/phpunit/includes/loader.php
+++ tests/phpunit/includes/loader.php
@@ -5,3 +5,5 @@ $multisite = (int) ( defined( 'WP_TESTS_MULTISITE') && WP_TESTS_MULTISITE );
 
 echo "Determining installation type...\n";
 system( WP_PHP_BINARY . ' ' . escapeshellarg( dirname( __FILE__ ) . '/install.php' ) . ' ' . escapeshellarg( WP_TESTS_CONFIG_PATH ) . ' ' . escapeshellarg( WP_TESTS_DIR ) . ' ' . $multisite );
+
+require dirname( __FILE__ ) . '/../../../src/bbpress.php';
diff --git tests/phpunit/includes/testcase.php tests/phpunit/includes/testcase.php
index 7cda2f9..4294952 100755
--- tests/phpunit/includes/testcase.php
+++ tests/phpunit/includes/testcase.php
@@ -29,6 +29,10 @@ class BBP_UnitTestCase extends WP_UnitTestCase {
 		}
 
 		$this->factory = new BBP_UnitTest_Factory;
+
+		if ( class_exists( 'BP_UnitTest_Factory' ) ) {
+			$this->bp_factory = new BP_UnitTest_Factory();
+		}
 	}
 
 	function clean_up_global_scope() {
diff --git tests/phpunit/testcases/extend/buddypress/groups.php tests/phpunit/testcases/extend/buddypress/groups.php
new file mode 100644
index 0000000..a47c0d6
--- /dev/null
+++ tests/phpunit/testcases/extend/buddypress/groups.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * @group extend
+ * @group buddypress
+ * @group groups
+ */
+class BBP_Tests_Extend_BuddyPress_Groups extends BBP_UnitTestCase {
+	public function setUp() {
+		parent::setUp();
+
+		if ( ! function_exists( 'buddypress' ) ) {
+			return;
+		}
+	}
+
+	/**
+	 * Copied from `BBP_Forums_Group_Extension::new_forum()`.
+	 */
+	private function attach_forum_to_group( $forum_id, $group_id ) {
+		bbp_add_forum_id_to_group( $group_id, $forum_id );
+		bbp_add_group_id_to_forum( $forum_id, $group_id );
+	}
+
+	/**
+	 * @ticket BBP2327
+	 */
+	public function test_bbp_is_forum_public_should_be_true_for_public_group_forums() {
+		$g = $this->bp_factory->group->create( array(
+			'status' => 'public',
+		) );
+
+		$f = $this->factory->forum->create();
+
+		$this->attach_forum_to_group( $f, $g );
+
+		$this->assertTrue( bbp_is_forum_public( $f ) );
+	}
+
+	/**
+	 * @ticket BBP2327
+	 */
+	public function test_bbp_is_forum_public_should_be_false_for_private_group_forums() {
+		$g = $this->bp_factory->group->create( array(
+			'status' => 'private',
+		) );
+
+		$f = $this->factory->forum->create();
+
+		$this->attach_forum_to_group( $f, $g );
+
+		$this->assertFalse( bbp_is_forum_public( $f ) );
+	}
+
+	/**
+	 * @ticket BBP2327
+	 */
+	public function test_bbp_is_forum_public_should_be_false_for_hidden_group_forums() {
+		$g = $this->bp_factory->group->create( array(
+			'status' => 'hidden',
+		) );
+
+		$f = $this->factory->forum->create();
+
+		$this->attach_forum_to_group( $f, $g );
+
+		$this->assertFalse( bbp_is_forum_public( $f ) );
+	}
+}
